疑问:配置<aop:aspectj-autoproxy proxy-target-class="true"/> 作用是什么?
......
aspectj-autoproxy配置解析过程
按照以往的分析,aop:xxx配置的解析由AopNamespaceHandler完成。
public class AopNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
// In 2.0 XSD as well as in 2.1 XSD.
registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser());
registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());// here!
registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator());
// Only in 2.0 XSD: moved to context namespace as of 2.1
registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
}
}
......
对应的AspectJAutoProxyBeanDefinitionParser完成了aop:aspectj-autoproxy解析,主要功能:注册AnnotationAwareAspectJAutoProxyCreator,该组件是BeanPostProcessor。这样等待BeanFactory.initializeBean阶段,该BeanPostProcessor根据当前的类是否有匹配pointcut的Advisor,产生代理类(具体看这里)。
// parse aop:aspectj-autoproxy
class AspectJAutoProxyBeanDefinitionParser implements BeanDefinitionParser {
public BeanDefinition parse(Element element, ParserContext parserContext) {
// 在此处注册BeanPostProcessor = AnnotationAwareAspectJAutoProxyCreator
// @see BeanFactory.applyBeanPostProcessorsAfterInitialization()
AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element);
extendBeanDefinition(element, parserContext);
return null;
}
}
总结
配置<aop:aspectj-autoproxy />,会注册APC-BeanPostProcessor至bean-factory,该BeanPostProcessor会作用在在getBean() initiate过程中,决定该bean是否有匹配的Advisor从而创建对应的proxy instance。
配置项proxy-target-class 决定DefaultAopProxyFactory.createAopProxy()是采用Cglib(true)还是JDK-Dynamic-Aop(default false)生成代理。
......
bean-factory 的advisor怎样初始化的,怎样判断是否有匹配的Advisor,怎样生成对应的功能的proxy?
to be continued...
备注
bean-factory 采用哪种级别的APC,在组件注册过程中有多处体现,下述代码段展示本文注册APC的处理过程:
/**
* 设置内置APC的级别(escalation) lsit.
*/
static {
// 初级:
和
解析都会涉及到该APC的注册。内部组件AOP支持
APC_PRIORITY_LIST.add(InfrastructureAdvisorAutoProxyCreator.class);
// 中级:
解析会涉及该APC的注册。xml组件AOP支持
APC_PRIORITY_LIST.add(AspectJAwareAdvisorAutoProxyCreator.class);
// 高级:
解析会涉及该APC的注册。自定义@AspectJ组件AOP支持
APC_PRIORITY_LIST.add(AnnotationAwareAspectJAutoProxyCreator.class);
}
/**
* beanFactory 全局唯一AUTO_PROXY_CREATOR,如果遇到更高级的AutoProxyCreator,则替换为高级的AutoProxyCreator。
* APC 的优先级在static 块中指定。
*/
if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) {
BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME);
if (!cls.getName().equals(apcDefinition.getBeanClassName())) {
int currentPriority = findPriorityForClass(apcDefinition.getBeanClassName());
int requiredPriority = findPriorityForClass(cls);
if (currentPriority < requiredPriority) {
apcDefinition.setBeanClassName(cls.getName());
}
}
return null;
}
/**
* APC 注册完毕后,就等待 postProcessBeforeInstantiation 搞点大动作吧!
*/