【Spring 注解驱动】学习笔记 06 - Spring AOP(六)AOP原理之创建AOP代理分析

参考资料

源码分析

上篇文章的末尾有说到 AnnotationAwareAspectJAutoProxyCreator 在所有 Bean 创建之前会有一个拦截,会调用 postProcessBeforeInstantiation() 方法。本篇文章主要分析一下自定义 Bean 的创建过程。
在这里插入图片描述

1、分析 postProcessBeforeInstantiation()

AbstractAutoProxyCreator#postProcessBeforeInstantiation()
在这里插入图片描述

1.1、判断当前 Bean 是否在 advisedBeans 中(advisedBeans 保存了所有需要增强 Bean)

在这里插入图片描述

1.2、判断当前 Bean 是否是基础类型

在这里插入图片描述
在这里插入图片描述
AbstractAutoProxyCreator#isInfrastructureClass()
在这里插入图片描述
AbstractAspectJAdvisorFactory#isAspect()
在这里插入图片描述
从上面的方法可以知道,基础类型包括 Advice、Pointcut、Advisor、AopInfrastructureBean,以及切面(@Aspect),因此,当前 Bean 不是基础类型。

1.3、判断当前 Bean 是否应该跳过

在这里插入图片描述
AspectJAwareAdvisorAutoProxyCreator#shouldSkip()
在这里插入图片描述

1.3.1、获取候选增强器(切面通知方法) candidateAdvisors

在这里插入图片描述
这四个增强器就是对应了切面类里面定义的四个通知方法。
在这里插入图片描述

1.3.2、判断每一个增强器是否是 AspectJPointcutAdvisor 类型的

在这里插入图片描述
四个增强器类型都是 InstantiationModelAwarePointcutAdvisor,所以全部返回 false。

1.3.3、调用父类方法 shouldSkip()

在这里插入图片描述
父类方法返回 false。

综上,回到主方法,是否应该跳过返回 false。

2、分析 postProcessAfterInitialization()

上面第 1 点全部完成后,方法会走到配置类创建 MathCalculator 对象,对象创建完成后继续调用 postProcessAfterInitialization() 方法。

AbstractAutoProxyCreator#postProcessAfterInitialization()
在这里插入图片描述
需要注意的方法是 wrapIfNecessary(),直译就是必要时包装。

AbstractAutoProxyCreator#wrapIfNecessary()
在这里插入图片描述

2.1、获取 Bean 的所有增强器(通知方法) getAdvicesAndAdvisorsForBean()

在这里插入图片描述
AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBean()
在这里插入图片描述
findEligibleAdvisors() 寻找符合条件的增强器。

AbstractAdvisorAutoProxyCreator#findEligibleAdvisors()
在这里插入图片描述
findCandidateAdvisors() 是四个候选增强器,即 1.3.1 中的四个。

findAdvisorsThatCanApply() 从候选增强器中找到可以应用的增强器,即找哪些通知方法是需要切入当前 Bean 方法的。

AbstractAdvisorAutoProxyCreator#findAdvisorsThatCanApply()
在这里插入图片描述
AopUtils#findAdvisorsThatCanApply()
在这里插入图片描述
通过以上方法找到了所有能用的增强器。

AbstractAdvisorAutoProxyCreator#findEligibleAdvisors()
在这里插入图片描述
将所有增强器进行排序 sortAdvisors(),然后返回,所有增强器被放在数组 Object[] specificInterceptors 中。

2.2、保存当前 Bean 在 advisedBeans

AbstractAutoProxyCreator#wrapIfNecessary()
在这里插入图片描述

2.3、创建代理对象 createProxy()

AbstractAutoProxyCreator#createProxy()
在这里插入图片描述

2.3.1、获取所有增强器(通知方法)保存到 proxyFactory

在这里插入图片描述

2.3.2、使用代理工厂创建代理对象

在这里插入图片描述
ProxyFactory#getProxy()
在这里插入图片描述
ProxyCreatorSupport#createAopProxy()

先创建AOP代理对象。
在这里插入图片描述
DefaultAopProxyFactory#createAopProxy()

创建AOP代理。
在这里插入图片描述
有两种代理方式:

  • JDK动态代理 new JdkDynamicAopProxy(config)
  • CGLIB动态代理 new ObjenesisCglibAopProxy(config)

经过以上方法,给容器中返回当前组件使用CGLIB增强了的代理对象。以后容器中获取到的就是这个组件的代理对象,执行目标方法的时候,代理对象就会执行通知方法的流程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MichelleChung

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

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

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

打赏作者

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

抵扣说明:

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

余额充值