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
在这里插入图片描述
排序规则我们在后面执行切面的时候再分析哈

参考博客

执行顺序
[1]https://segmentfault.com/q/1010000020147155

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring AOPSpring框架中的一个重要模块,它提供了一种面向切面编程的方式,可以让开发者将一些通用的、横切的关注点(如事务、安全、缓存等)从业务逻辑中剥离出来,使得业务逻辑更加清晰简洁,代码复用更加方便。 Spring AOP的实现原理主要基于Java动态代理和CGLIB动态代理两种方式,其中Java动态代理主要用于接口代理,而CGLIB动态代理则主要用于类代理。Spring AOP中的核心概念是切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和织入(Weaving)。 在Spring AOP中,切面是一个横向的关注点,它跨越多个对象和方法,通常包含一些通用的功能,如日志记录、安全控制等。连接点则是程序中可以被切面拦截的特定点,如方法调用、异常抛出等。通知是切面在连接点执行前后所执行的动作,包括前置通知(Before)、后置通知(After)、异常通知(AfterThrowing)、返回通知(AfterReturning)和环绕通知(Around)。切点则是用来匹配连接点的规则,它可以指定哪些连接点会被切面拦截。织入则是将切面应用到目标对象中的过程,它可以在编译时、类加载时、运行时等不同的阶段进行。 Spring AOP源码解析涉及到很多细节,包括代理的生成、通知的执行、切点的匹配等,需要深入了解Spring框架的内部实现和Java的反射机制。对于初学者而言,可以先从Spring AOP的基本概念和用法入手,了解其实现原理的同时,也可以通过调试和查看源码来加深理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java识堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值