0
点赞
收藏
分享

微信扫一扫

Spring AOP源码解析:解析切面


Spring AOP源码解析:解析切面_自定义

实例化前阶段

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

Spring AOP源码解析:解析切面_自定义_02


AbstractAutoProxyCreator#postProcessBeforeInstantiation

Spring AOP源码解析:解析切面_自定义_03


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

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

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

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

Spring AOP源码解析:解析切面_spring_04


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

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

isInfrastructureClass

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

Spring AOP源码解析:解析切面_自定义_05


AnnotationAwareAspectJAutoProxyCreator#isInfrastructureClass

Spring AOP源码解析:解析切面_自定义_06


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

Spring AOP源码解析:解析切面_spring_07


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

Spring AOP源码解析:解析切面_java_08

shouldSkip

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

AspectJAwareAdvisorAutoProxyCreator#shouldSkip

Spring AOP源码解析:解析切面_spring_09


AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors

Spring AOP源码解析:解析切面_自定义_10

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

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

AspectJAwareAdvisorAutoProxyCreator#shouldSkip

Spring AOP源码解析:解析切面_后端_11


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

初始化后阶段

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

AbstractAutoProxyCreator#postProcessAfterInitialization

Spring AOP源码解析:解析切面_基础类_12


AbstractAutoProxyCreator#wrapIfNecessary

Spring AOP源码解析:解析切面_spring_13


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

Spring AOP源码解析:解析切面_自定义_14


AbstractAdvisorAutoProxyCreator#findEligibleAdvisors

Spring AOP源码解析:解析切面_基础类_15


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

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

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

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

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

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

AspectJAwareAdvisorAutoProxyCreator#sortAdvisors

Spring AOP源码解析:解析切面_spring_16


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



举报

相关推荐

0 条评论