Insight aop:aspectj-autoproxy 解析

疑问:配置<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 搞点大动作吧!
 */
     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值