读书人

Acegi里一个很奇怪的步骤调用

发布时间: 2012-10-25 10:58:57 作者: rapoo

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()]);
??? }

while (cads.hasNext()) { ConfigAttributeDefinition attribDef = (ConfigAttributeDefinition) cads.next(); Filter[] filters = obtainAllDefinedFilters(attribDef); for (int i = 0; i < filters.length; i++) { list.add(filters[i]); } }
因该是需要循环找到所有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容器,所以这三个方法几乎不会被调用到。除非你需要集成第三方,而且你没有第三方的源码。

读书人网 >软件架构设计

热点推荐