SpringAOP实现:(二)筛选匹配的横切逻辑实例

前言:

由于动态代理对象的创建并不需要也不会去干预bean的实例化、属性赋值、初始化。而初始化结束才意味着bean被创建完成,因此Spring会等到bean初始化之后,也就是执行完.invokeInitMethods()方法。才会将相关的横切逻辑织入到bean里。Spring的横切逻辑主要放在了初始化bean之后的applyBeanPostProcessorsAfterInitialization().BeanPostProcessor.postProcessAfterInitialization()。

 

 

 

 

 

在initializeBean()方法对Bean的初始化之后呢,AbstractAutoProxyCreator实现了SmartInstantiationAwareBeanPostProcessor接口,从而就会调用类下的postProcessAfterInitialization()方法对bean进行横切逻辑的织入。方法中会调用warpIfNecessary()对Bean进行横切逻辑的织入,warpIfNecessary方法中会调用createProxy()开始执行创建动态代理的逻辑,而createProxy方法会委托动态代理的创建工厂的getProxy()方法,根据不同的策略来决定使用JDK的或者是CGLIB的动态代理

 


 

 

 

AbstractAutoProxyCreator

横切逻辑织入的入口方法:

  postProcessAfterInitialization:正常流程的织入入口

  getEarlyBeanReference:依赖循环的织入入口

 

 

AbstractAutoProxyCreator.postProcessAfterInitialization()执行流程:

  (1)对bean进行判空,如果是空的直接返回null

  (2)从缓存中获取到beanName

  (3)wrapIfNecessary(),该方法会返回代理类

    (1)从缓存中查看是不是已经被处理过了  (2)如果不需要被织入逻辑直接返回  (3)判断是不是基础bean或者是需要跳过(如果是缓存中设置上记号后返回bean)

    (4)getAdvicesAndAdvisorsForBean()方法返回匹配当前Bean的所有Advice、Advisor、Interceptor

      (跟进到AbstractAdvisorAutoProxyCreator类的getAdvicesAndAdvisorsForBean()方法,该方法中调用findEligibleAdvisors()方法,获取到合适的Advisors列表然后转换成数组返回回去)

        (A)找到SpringIoc容器中所有的候选Advisor(AnnotationAwareAspectJAutoProxyCreator.findEligibleAdvisors()方法)

            (1)从父类中获取所有Advisors   

            (2)调用buildAspectJAdvisors()方法获取容器中被@Aspect标记的类中所有的Advisors然后跟(1)获取的合并

        (B)判断找到的Advisor能不能作用到当前的类上(AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply()方法)

            (1)将要织入横切逻辑的目标beanName设置到当前的代理BeanName上 

            (2)调用AopUtils的findAdvisorsThatCanApply()方法,将获取到的所有候选Advisors进行筛选看是否可以作用在当前要织入横切的类上 

               (3)最后将(1)设置的代理beanName恢复为null

        (C)对获取到的advisor进行排序

        (D)返回合适的Advisors列表

 

posted @ 2021-03-03 16:44  _kerry  阅读(104)  评论(0编辑  收藏  举报