概述
前面两篇文章分析了在注解配置和 XML 配置的情况下,Spring 是如何开启 AOP 特性的,经过源码分析我们知道,这两种方式的 AOP 开启,本质上都是注册了一个用来创建 AOP 代理的后处理器。
对于在 XML 中配置切面的情况,Spring 会把创建代理的工作交给 AspectJAwareAdvisorAutoProxyCreator 后处理器来处理,而对于通过注解配置切面的情况,则交由 AnnotationAwareAspectJAutoProxyCreator 后处理器处理。
在本文章,将对这两个后处理器进行分析,了解他们大致的工作原理。
继承关系
AspectJAwareAdvisorAutoProxyCreator 和 AnnotationAwareAspectJAutoProxyCreator 两个后处理器的继承关系,在前两篇文章中已经了解过了,这里我们再做简单的回顾。
从上图中可以知道,这两个类是直接继承的父子类,他们有很多共同继承的类和实现的接口,可以推测出他们的工作逻辑有很大一部分是相同的。
由于他们是作为后处理器注册到 Spring 容器中的,因此,他们完成 AOP 代理创建的逻辑,一定是在后处理器的方法中。从上图中看到,他们共实现了三个后处理器的接口,接下来,我们再看这三个接口中定义的方法。
实现接口
先看看这三个接口都定义了哪些方法。
既然后处理器的作用要生成一个代理对象,那么,我们就应该去分析后处理器中可以修改被处理的 Bean 对象的处理方法,再上图中罗列的方法中有以下这些:
postProcessBeforeInstantiation
方法可以在 Spring 实例化 Bean 对象之前,创建一个 Bean 对象。postProcessBeforeInitialization
方法可以在 Bean 的初始化方法被执行前,修改 Bean 对象。postProcessAfterInitialization
方法可以在 Bean 的初始化方法被执行前,修改 Bean 对象。
以上三个方法,都可能在执行的过程中,将当前的 Bean 对象,修改为新创建的代理对象。因