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列表