Spring AOP源码解析:解析切面

网友投稿 1335 2022-10-07

Spring AOP源码解析:解析切面

Spring AOP源码解析:解析切面

实例化前阶段

之前的章节我们聊到了spring aop和ioc结合的阶段,本节我们来详细分析一下

AbstractAutoProxyCreator#postProcessBeforeInstantiation

这个方法主要解析用户配置的切面类,getCustomTargetSource用来处理用户自定义TargetSource的场景,一般没人自定义,所以这块内容就不分析了

targetSourcedBeans是用来保存用户自定义的bean,所以刚开始的if语句的第二个条件基本上都满足,第一个条件基本上不满足(我在本地debug的时候没发现有beanName为空的场景)

!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)

而advisedBeans里面存的是和spring aop相关的基础类,分别追一下2个方法。我先画个流程图,这样后面看源码的时候不会乱。

isInfrastructureClass主要判断类是否是aop相关的基础类,是的话就缓存下来,后续创建代理的时候会跳过。

shouldSkip接着判断非aop相关的基础类是否需要跳过代理,不太重要我就不分析了。这里方法有个很重要的功能,就是会把容器中配置的切面都解析出来,并缓存下来,因此解析的过程只会发生一次

isInfrastructureClass

开启aspect的时候,AbstractAutoProxyCreator的实现类为AnnotationAwareAspectJAutoProxyCreator,因此会先执行到如下方法

AnnotationAwareAspectJAutoProxyCreator#isInfrastructureClass

接着调用父类,主要用来判断是否是aop一代相关的基础类AbstractAutoProxyCreator#isInfrastructureClass

判断完是否是aop一代相关的基础类,接着判断类上是否有Aspect注解,这是aop二代的定义方式哈AbstractAspectJAdvisorFactory#isAspect

shouldSkip

shouldSkip我们只分析最重要的部分,即解析切面类

AspectJAwareAdvisorAutoProxyCreator#shouldSkip

AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors

super.findCandidateAdvisors(),这里再次调用父类的实现,用于支持在xml或者实现接口定义切面的形式

this.aspectJAdvisorsBuilder.buildAspectJAdvisors(),这个方法用于支持通过@Aspect定义切面的形式

AspectJAwareAdvisorAutoProxyCreator#shouldSkip

跳过的逻辑我就不分析了哈,有兴趣的小伙伴可以看看

初始化后阶段

在文章最开始的图上,我已经标明了,在实例化后阶段,当发生循环依赖时,代理对象会提前生成,因此在初始化后阶段生成代理对象的时候需要先判断一下,如果代理对象已经生成了,就不用再代理了

AbstractAutoProxyCreator#postProcessAfterInitialization

AbstractAutoProxyCreator#wrapIfNecessary

跳过不需要代理的Bean,然后获取某个Bean对应的Advisor,接着根据Advisor生成代理对象AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBean

AbstractAdvisorAutoProxyCreator#findEligibleAdvisors

findEligibleAdvisors是一个很重要的方法,我们一行一行来分析

findEligibleAdvisors,获取容器中配置的所有的Advisor,在实例化前阶段我们已经解析好了并缓存下来了哈

findAdvisorsThatCanApply,获取适用于当前Bean的Advisor

extendAdvisors,是一个扩展方法,可以给Bean增加适用的Advisor,AbstractAdvisorAutoProxyCreator实现默认为空,而AspectJAwareAdvisorAutoProxyCreator给Bean增加ExposeInvocationInterceptor

sortAdvisors,对适用于当前Bean的Advisor进行排序

sortAdvisors(对适用于当前Bean的Advisor进行排序)

AspectJAwareAdvisorAutoProxyCreator#sortAdvisors

排序规则我们在后面执行切面的时候再分析哈

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:怎样使用React虚拟DOM(react怎么创建虚拟dom)
下一篇:Spring IOC源码解析:Spring Bean生命周期详解(二)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~