23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
Spring版本:
<version>5.2.1.RELEASE</version>
上一篇:22-Spring源码解析之AOP(1)——@EnableAspectJAutoProxy注解原理
上一篇我们完成了@EnableAspectJAutoProxy
注解的解析,@EnableAspectJAutoProxy
注解就解析完成,解析的结果就是:将AnnotationAwareAspectJAutoProxyCreator
类转换为BeanDefintion
并将其存储到beanFactory
中。
上篇遗留了4个问题,本篇就带着这4个问题开始分析。是哪四个问题来着?忘记了不要紧,我再贴一下:
-
【问题一】为什么在配置类中写了
@EnableAspectJAutoProxy
注解,Spring
就为我们在容器中注册了一个AnnotationAwareAspectJAutoProxyCreator
类的BeanDefinition
-
【问题二】
AnnotationAwareAspectJAutoProxyCreator
类是什么,它的类结构是什么样子的 -
【问题三】
BeanDefinition
只是Bean
的定义信息,什么时候创建AnnotationAwareAspectJAutoProxyCreator
类 -
【问题四】实现
AOP
功能与AnnotationAwareAspectJAutoProxyCreator
类有什么关系
【问题一】暂时还没有办法回答,当AOP
的功能都讲解完,这个问题自然就有了答案。因此,我们开始从【问题二】来一个一个回答。
一、AnnotationAwareAspectJAutoProxyCreator
类结构
想要了解一个类,那么我们首先应该看看它的父类、接口的信息。下面给出AnnotationAwareAspectJAutoProxyCreator
类的类结构图。
public class AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator
public class AspectJAwareAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator
public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
public class ProxyProcessorSupport extends ProxyConfig
implements Ordered, BeanClassLoaderAware, AopInfrastructureBean
我们可以看到AnnotationAwareAspectJAutoProxyCreator
类的继承关系,其中它的父类AbstractAutoProxyCreator
实现了两个非常重要的接口:SmartInstantiationAwareBeanPostProcessor
和BeanFactoryAware
。继承一个ProxyProcessorSupport
类,继承ProxyProcessorSupport
类说明AspectJAnnotationAutoProxyCreator
也属于Ordered
类型。
SmartInstantiationAwareBeanPostProcessor
接口我们之前应该也有接触过。忘记了?没关系,我再贴一次。
根据上面的图,我们可以知道SmartInstantiationAwareBeanPostProcessor
接口是BeanFactory
的子接口,因此,AnnotationAwareAspectJAutoProxyCreator
类实际上是一个BeanPostProcessor
。另外,注意它还是属于Ordered
接口的类。它还有BeanFactoryAware
能力
至此,文章开头的【问题二】就有了答案。
-
【问题二】
AnnotationAwareAspectJAutoProxyCreator
类是什么?它的类结构是什么样子的? -
【答案】:
-
AnnotationAwareAspectJAutoProxyCreator
是一个BeanPostProcessor
。 -
AnnotationAwareAspectJAutoProxyCreator
也是一个Ordered
。 -
AnnotationAwareAspectJAutoProxyCreator
还是BeanFactoryAware
实现类 -
AnnotationAwareAspectJAutoProxyCreator
类结构上图可见
-
接下来,我们来解决【问题三】:BeanDefinition
只是Bean
的定义信息,什么时候创建AspectJAnnotationAutoProxyCreator
类。
二、注册AspectJAnnotationAutoProxyCreator
类
我们现在知道AspectJAnnotationAutoProxyCreator
类是一个BeanPostProcessor
。那么自然而然它的创建应该在refresh
方法调用的第6个方法registerBeanPostProcessors
中。这里我只抽取与该功能有关的部分代码进行讲解,与该功能无关的方法暂时省略。(若有兴趣全方位了解registerBeanPostProcessors
方法的同学参见文章12-Spring源码解析之refresh(5)——registerBeanPostProcessors)
从上一节我们知道,AspectJAnnotationAutoProxyCreator
类还属于Ordered
,因此,我们直接找到registerBeanPostProcessors
方法注册Ordered
类型的Bean
的部分。
在分析之前,有必要先看一下beanFactory
中已经创建的Bean
有哪些。
这些Bean
的创建与AOP
无关,若感兴趣可以参考文章:12-Spring源码解析之refresh(5)——registerBeanPostProcessors。
我们可以来分析AspectJAnnotationAutoProxyCreator
的注册过程了。
进入PostProcessorRegistrationDelegate
类的registerBeanPostProcessors
方法。找到与创建AOP
功能有关的区域:即注册Ordered
类型的BeanPostProcessor
区域
我又标注了一个图一,说明我们一会还会回到这个图一。
从上图可以看出,我们项目中只有一个属于Ordered
类型的BeanPostProcessor
,即与AOP
功能有关的AnnotationAwareAspectJAutoProxyCreator
类。然后从beanFactory
中通过调用getBean
方法获取该类,但是到目前为止,我们对AnnotationAwareAspectJAutoProxyCreator
类的操作只是将它转换为BeanDefintion
,然后将该BeanDefintion
存储到beanFactory
中,并没有实例化该bean
,因此此时getBean
是创建AnnotationAwareAspectJAutoProxyCreator
。创建过程有很多,这里我只抽取与该功能有关的部分代码进行讲解,与该功能无关的方法暂时省略。(若有兴趣全方位了解getBean
方法的同学参见文章16-Spring源码解析之Bean的生命周期(1)——doGetBean)
创建AnnotationAwareAspectJAutoProxyCreator
类型的Bean
在实例化Bean
(createBeanInstance
)后执行initializeBean
方法时,由于该类实现了BeanFactoryAware
,因此会执行initializeBean
中的invokeAwareMethods
方法
我们进入invokeAwareMethods
方法
因为AnnotationAwareAspectJAutoProxyCreator
实现了BeanFactoryAware
,所以它走第三个if
语句,调用AnnotationAwareAspectJAutoProxyCreator
类的setBeanFactory
方法。 虽然AnnotationAwareAspectJAutoProxyCreator
类没有重写该方法,但是其父类AbstractAdvisorAutoProxyCreator
重写了该方法
AbstractAdvisorAutoProxyCreator
又调用了父类AbstractAutoProxyCreator
的setBeanFactory
方法
执行完super.setBeanFactory(beanFactory);
我们再回到图二,执行initBeanFactory
方法。
AbstractAdvisorAutoProxyCreator
类调用其父类的initBeanFactory
方法
执行完super.initBeanFactory(beanFactory);
我们再回到图三。
我们可以从图三看出,这一步在AnnotationAwareAspectJAutoProxyCreator
类中创建了两个对象:
aspectJAdvisorFactory
aspectJAdvisorsBuilder
至此,Spring
已经完成了对AnnotationAwareAspectJAutoProxyCreator
类对应的Bean
的创建,我们再来看看beanFactory
中已经创建Bean
的列表
我们可以和本篇二节的第一张图对比,可以看出多了internalAutoProxyCreator
,而internalAutoProxyCreator
正是AnnotationAwareAspectJAutoProxyCreator
类对应的Bean
。
创建完AnnotationAwareAspectJAutoProxyCreator
类对应的Bean
后,就说明getBean
方法已经将创建好的AnnotationAwareAspectJAutoProxyCreator
返回回来了,我们回到图一。
就说明现在orderedPostProcessors
中的值为AnnotationAwareAspectJAutoProxyCreator
类型的Bean
。
接着我们执行图一中的registerBeanPostProcessors
方法,从方法名中我们可以知道,该方法就是将BeanPostProcessors
注册到beanFactory
中。
我们先看一下当前beanFactory
中的BeanPostProcessors
情况。
从上幅图片可以看出当前beanFactory
中有6个BeanPostProcessors
。
接着我们跟踪到图一的registerBeanPostProcessors
方法中。
从图中可以看出,当前项目只有一个Ordered
类型的BeanPostProcessor
。我们继续进入beanFactory.addBeanPostProcessor
方法
beanFactory.addBeanPostProcessor
方法会根据BeanPostProcessor
所属的类型,将beanFactory
的对应属性设置为true
,这样做的目的是在其他普通Bean
创建时更好的判断是hi否执行对应的后置处理器。然后将BeanPostProcessor
放入beanFactory
的beanPostProcessor
属性中保存。 执行完上面的操作后,我们看一下beanFactory
与该功能有关的属性的情况。
对比图四我们可以看到,beanFactory
的beanPostProcessor
中增加了AnnotationAwareAspectJAutoProxyCreator
。
至此,文章开头的【问题三】就有了答案。
- 【问题三】
BeanDefinition
只是Bean
的定义信息,什么时候创建AnnotationAwareAspectJAutoProxyCreator
类 -
【答案】:
- 在
refresh
调用的第六个方法registerBeanPostProcessors
中的Ordered
区域创建的AnnotationAwareAspectJAutoProxyCreator
类对应的Bean
- 并在创建完
Bean
后,将该Bean
加入到了beanFactory
的beanPostProcessor
中。
- 在
三、总结
本篇文章开头提出的4个问题,在本篇文章中解决了2个。
-
【问题二】
AnnotationAwareAspectJAutoProxyCreator
类是什么?它的类结构是什么样子的? -
【答案】:
-
AnnotationAwareAspectJAutoProxyCreator
是一个BeanPostProcessor
。 -
AnnotationAwareAspectJAutoProxyCreator
也是一个Ordered
。 -
AnnotationAwareAspectJAutoProxyCreator
还是BeanFactoryAware
实现类 -
AnnotationAwareAspectJAutoProxyCreator
类结构上图可见
-
- 【问题三】
BeanDefinition
只是Bean
的定义信息,什么时候创建AnnotationAwareAspectJAutoProxyCreator
类 -
【答案】:
- 在
refresh
调用的第六个方法registerBeanPostProcessors
中的Ordered
区域创建的AnnotationAwareAspectJAutoProxyCreator
类对应的Bean
- 并在创建完
Bean
后,将该Bean
加入到了beanFactory
的beanPostProcessor
中。
- 在
下一篇文章,我们开始解决最后一个问题:实现AOP
功能与AnnotationAwareAspectJAutoProxyCreator
类有什么关系。
推荐阅读
-
23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
-
Java并发之ReentrantLock类源码解析
-
Java并发之ReentrantLock类源码解析
-
asp.net abp模块化开发之通用树2:设计思路及源码解析
-
Vue之Watcher源码解析(2)
-
源码系列【springboot之@Import注解多个类引入同一个类源码解析】
-
andorid jar/库源码解析之retrofit2
-
andorid jar/库源码解析之Dagger/Dagger2
-
andorid jar/库源码解析之RxJava2
-
asp.net abp模块化开发之通用树2:设计思路及源码解析