aop源码初入

1、@EnableAspectJAutoProxy
导入了AnnotationAwareAspectJAutoProxyCreator组件
2、分析AnnotationAwareAspectJAutoProxyCreator继承关系
AnnotationAwareAspectJAutoProxyCreator 继承关系发现了他具有BeanPostProcessor接口特性和InstantiationAwareBeanPostProcessor的特性。
3、在第一个bean被创建时缓存切面(InstantiationAwareBeanPostProcessor)
根据bean的生命周期,在doCreatBean里面的resolveBeforelnstantiation方法,会触发

InstantiationAwareBeanPostProcessor的的postProcessBeforeInstantiation方法,在里面会找到所有@Aspectj的切面找到,并且缓存起来。
       postProcessBeforeInstantiation
             shouldSkip()
                    findCandidateAdvisors();
                            findCandidateAdvisors();找现成的增强器(事务相关)
                            buildAspectJAdvisors;//找@Aspectj相关的,生成Advisors增强器
                                    this.advisorsCache.put(beanName, classAdvisors);//缓存起来

4、创建代理对象(BeanPostProcessor )
创建对象时,在属性赋值完成后,初始化方法里,触发BeanPostProcessor .after方法,在此方法中,根据方法匹配去找自己的切面(增强器),然后把增强器和被切的对象创成-个代理对象。

   postProcessAfterInitialization
           wrapIfNecessary   //不需要创建代理对象,就直接返回bean
                     getAdvicesAndAdvisorsForBean//需要创建代理对象
                              findEligibleAdvisors//获取增强器
                                       findCandidateAdvisors();//找到候选的,可从缓存中取,3步骤已放
                                       findAdvisorsThatCanApply//从候选的中找到能用的
                    createProxy()//创建代理对象
                          ProxyFactory proxy = new ProxyFactory();

5、调用过程
可以通过order指定调用顺序,不加默认是最后调用

getInterceptorsAndDynamicInterceptionAdvice   获取调用链
采用递归及责任链模式,依次调用
         异常通知(放在cacth中,异常时会走)
                   ->  返回通知(抛异常就不走了)
                            ->后置通知(finily中,总是执行)
                                      ->前置通知  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值