你需要知道的一些知识点
1. cglib和jdk动态代理 两种代理的原理
2. spring getbean和createbean的流程
3. aop的基本概念
4. springboot 的自动配置原理
spring aop 的原理概述
了解sping getBean过程的的一定知道 在createBean的过程中有各种各样的postProcess,
穿插在生成bean的各个时间段,这些都叫做 bean的增强,
而这些bean的增强 都会通过代理来生成最终的bean的代理对象,
就是说 我们在sping中使用的bean ,大多数可能都不是 原生bean,可能都是bean的代理对象。
那下面我们就拆开来 一个一个剖析 aop 的原理
springboot 启动加载aop配置类
springboot 启动的时候会加载 AopAutoConfiguration(ps springboot启动的时候会加载 autuconfigure中 spring.factories 中 配置的各个配置类)
上图该方法最终导入 AnnotationAwareAspectJAutoProxyCreator 类
aop配置类实现 postProcessBeforeInstantiation 和 postProcessAfterInitialization 方法
上图是AnnotationAwareAspectJAutoProxyCreator 的类图 我们发现 它实现了 InstantiationAwareBeanPostProcessor
不知道大家对 InstantiationAwareBeanPostProcessor 这个方法 熟悉吗 ,这个方法是 spring getbean的过程中 在bean instantiation的前后执行的方法。
我们继续在类AbstractAutoProxyCreator 中 看它的实现 postProcessBeforeInstantiation 和 postProcessAfterInitialization
postProcessBeforeInstantiation
上图 在这个方法中 会获取所有的通知并判断 是否和aop相关,如果相关的话会添加到如下map中
上面的三个图片的这些方法 发生在 bean 实例话的前面 ,如下图
点进去resolveBeforeInstantiation 方法 你会看在在这里处理了postProcessBeforeInstantiation
由上面的方法 我们发现在 实例话bean的前一个步骤中,aop的配置方法 将相关的通知bean全部放到了advisedBeans 中 方便后续使用
postProcessAfterInitialization 生成代理对象
接下来我们看看另外一个 postProcessAfterInitialization 方法
该方法故名思义 是放在在 bean 初始化之后执行 我们先看一下 这个方法 在创建bean的过程中 放生的时机吧
上图中 就是初始化bean 完成之后 增强的方法,该方法会循环调用 实现了postProcessAfterInitialization 的各个实现
接下来我们看一下 aop的配置方法是怎么实现的
我们直接进入 wrapIfNecessary
在这一步 我们发现 我们的上一个方法 添加的advisedBeans 最终排上了用场
获取到所有的通知 然后生成代理对象 最终返回
至此 aop的流程就算完结了
在处理bean的增强的时候实际上 循环的是 BeanFactory中的beanPostProcessors属性,那你知道这个属性是什么时候加载进去的吗
这就又和springboot 的 启动方法挂上钩了
在springboot run 方法中的 refresh 方法中
见下图