Acegi里一个很奇怪的方法调用
看Acegi源码时,发现这么一段有些奇怪的代码.
?protected Filter[] obtainAllDefinedFilters() {
??????? Iterator cads = this.filterInvocationDefinitionSource.getConfigAttributeDefinitions();
??????? Set list = new LinkedHashSet();
??????? while (cads.hasNext()) {
??????????? ConfigAttributeDefinition attribDef = (ConfigAttributeDefinition) cads.next();
??????????? Filter[] filters = obtainAllDefinedFilters(attribDef);
??????????? for (int i = 0; i < filters.length; i++) {
??????????????? list.add(filters[i]);
??????????? }
??????? }
??????? return (Filter[]) list.toArray(new Filter[0]);
?}
红色的代码为什么不直写成: return obtainAllDefinedFilters(attribDef);呢? 毕竟obtainAllDefinedFilters本身就是返回一个Filter数组,为什么那个方法里还有再重复的加到一个List中,再把list转为数组呢?
是Acegi开发小组粗心的过?还是有意为之?
?
下面是红色代码调用的那个方法:
?
private Filter[] obtainAllDefinedFilters(ConfigAttributeDefinition configAttributeDefinition) {
??????? List list = new Vector();
??????? Iterator attributes = configAttributeDefinition.getConfigAttributes();
??????? while (attributes.hasNext()) {
??????????? ConfigAttribute attr = (ConfigAttribute) attributes.next();
??????????? String filterName = attr.getAttribute();
??????????? if (filterName == null) {
??????????????? throw new IllegalArgumentException("Configuration attribute: '" + attr
??????????????????? + "' returned null to the getAttribute() method, which is invalid when used with FilterChainProxy");
??????????? }
??????????? if (!filterName.equals(TOKEN_NONE)) {
??????????????? list.add(this.applicationContext.getBean(filterName, Filter.class));
??????????? }
??????? }
??????? return (Filter[]) list.toArray(new Filter[list.size()]);
??? }
因该是需要循环找到所有cads对应的filter把,为了避免多个cads对应的filter存在重复,所以用set。。
所以更不能直接使用 return obtainAllDefinedFilters(attribDef)把,这样不就只返回一个cads对应的filter了么??
貌似以前我也写过类似的代码。。。。 2 楼 rmn190 2008-10-07 有道理, 我被它Set list = new LinkedHashSet(); 这一行里的起名方式给迷惑了.
谢谢! 3 楼 SINCE1978 2009-06-01 看得很细,其实obtainAllDefinedFilters()这个方法不必看,因为它仅仅由FilterChainProxy的init和destroy所调用,acegi的推荐方式是FilterChainProxy由ioc容器托管而非servlet容器,所以这三个方法几乎不会被调用到。除非你需要集成第三方,而且你没有第三方的源码。