今天研究acegi时遇到一个问题,filterChainProxy类中的filterInvocationDefinitionSource是FilterInvocationDefinitionSource类型,而在配置文件中传入了一个String类型的值。其间怎么转化,没弄明白,源码中也没有找到。但是在网上搜到这样一个帖子,原理解释的很明白。原帖地址:http://www.javaeye.com/topic/165714
下面是摘录的关键部分:
曾经查看Acegi的源码,FilterSecurityInterceptor的objectDefinitionSource属性的类型为FilterInvocationDefinitionSource,猜测Acegi是使用FilterInvocationDefinitionSourceEditor读取配置并赋值给它(objectDefinitionSource)的,因为查看FilterInvocationDefinitionSourceEditor的源码,其中有相关的读取配置的代码。但FilterInvocationDefinitionSourceEditor是在何时及如何被调用的呢?
在Spring的官方论坛中找到一个帖子:http://forum.springframework.org/showthread.php?t=11242&highlight=objectDefinitionSource
其中提到:
PropertyEditorManager是java.beans包中的一个类,难道其中的根据“类型名称+Editor”来查找属性相应的编辑器(姑且这么翻译)的机制是Java早就拥有的?查看JDK中PropertyEditorManager相关的内容,果然找到上面的那段话!
原来是这样!难怪在Spring、Acegi的源码中都找不到注册或调用FilterInvocationDefinitionSourceEditor的代码。我以为这是Spring或Acegi提供的机制,原来是Java的标准机制!
至此可以理解读取配置并给属性赋值的过程大致如下:
1.Spring读取Acegi相关的配置,知道需要把类似
PATTERN_TYPE_APACHE_ANT
/secured/usermanage/**=ROLE_TEST
/secured/**=ROLE_USER
的内容赋值给bean filterSecurityInterceptor的objectDefinitionSource属性
2.Spring知道filterSecurityInterceptor的objectDefinitionSource属性的类型为FilterInvocationDefinitionSource,查找该类型的编辑器。因为Acegi并未为该类型显式地注册编辑器(查Acegi代码可知),Spring应用上面的规则查到相应的编辑器为FilterInvocationDefinitionSourceEditor
3.Spring实例化FilterInvocationDefinitionSourceEditor,并调用它完成后续的读取配置并给属性赋值的工作