欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码

程序员文章站 2024-01-29 12:58:46
...

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类的类结构图。
23-Spring源码解析之AOP(2)——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实现了两个非常重要的接口:SmartInstantiationAwareBeanPostProcessorBeanFactoryAware。继承一个ProxyProcessorSupport类,继承ProxyProcessorSupport类说明AspectJAnnotationAutoProxyCreator也属于Ordered类型。

SmartInstantiationAwareBeanPostProcessor接口我们之前应该也有接触过。忘记了?没关系,我再贴一次。

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码

根据上面的图,我们可以知道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有哪些。
23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
这些Bean的创建与AOP无关,若感兴趣可以参考文章:12-Spring源码解析之refresh(5)——registerBeanPostProcessors

我们可以来分析AspectJAnnotationAutoProxyCreator的注册过程了。

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
进入PostProcessorRegistrationDelegate类的registerBeanPostProcessors方法。找到与创建AOP功能有关的区域:即注册Ordered类型的BeanPostProcessor区域
23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
我又标注了一个图一,说明我们一会还会回到这个图一。

从上图可以看出,我们项目中只有一个属于Ordered类型的BeanPostProcessor,即与AOP功能有关的AnnotationAwareAspectJAutoProxyCreator类。然后从beanFactory中通过调用getBean方法获取该类,但是到目前为止,我们对AnnotationAwareAspectJAutoProxyCreator类的操作只是将它转换为BeanDefintion,然后将该BeanDefintion存储到beanFactory中,并没有实例化该bean,因此此时getBean是创建AnnotationAwareAspectJAutoProxyCreator。创建过程有很多,这里我只抽取与该功能有关的部分代码进行讲解,与该功能无关的方法暂时省略。(若有兴趣全方位了解getBean方法的同学参见文章16-Spring源码解析之Bean的生命周期(1)——doGetBean

创建AnnotationAwareAspectJAutoProxyCreator类型的Bean在实例化BeancreateBeanInstance)后执行initializeBean方法时,由于该类实现了BeanFactoryAware,因此会执行initializeBean中的invokeAwareMethods方法

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码

我们进入invokeAwareMethods方法

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码

因为AnnotationAwareAspectJAutoProxyCreator实现了BeanFactoryAware,所以它走第三个if语句,调用AnnotationAwareAspectJAutoProxyCreator类的setBeanFactory方法。 虽然AnnotationAwareAspectJAutoProxyCreator类没有重写该方法,但是其父类AbstractAdvisorAutoProxyCreator重写了该方法

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码

AbstractAdvisorAutoProxyCreator又调用了父类AbstractAutoProxyCreatorsetBeanFactory方法

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
执行完super.setBeanFactory(beanFactory);我们再回到图二,执行initBeanFactory方法。

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
AbstractAdvisorAutoProxyCreator类调用其父类的initBeanFactory方法
23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
执行完super.initBeanFactory(beanFactory);我们再回到图三。

我们可以从图三看出,这一步在AnnotationAwareAspectJAutoProxyCreator类中创建了两个对象:

  • aspectJAdvisorFactory
  • aspectJAdvisorsBuilder

至此,Spring已经完成了对AnnotationAwareAspectJAutoProxyCreator类对应的Bean的创建,我们再来看看beanFactory中已经创建Bean的列表

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
我们可以和本篇二节的第一张图对比,可以看出多了internalAutoProxyCreator,而internalAutoProxyCreator正是AnnotationAwareAspectJAutoProxyCreator类对应的Bean

创建完AnnotationAwareAspectJAutoProxyCreator类对应的Bean后,就说明getBean方法已经将创建好的AnnotationAwareAspectJAutoProxyCreator返回回来了,我们回到图一。

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码

就说明现在orderedPostProcessors中的值为AnnotationAwareAspectJAutoProxyCreator类型的Bean

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码

接着我们执行图一中的registerBeanPostProcessors方法,从方法名中我们可以知道,该方法就是将BeanPostProcessors注册到beanFactory中。

我们先看一下当前beanFactory中的BeanPostProcessors情况。

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码

从上幅图片可以看出当前beanFactory中有6个BeanPostProcessors

接着我们跟踪到图一的registerBeanPostProcessors方法中。
23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
从图中可以看出,当前项目只有一个Ordered类型的BeanPostProcessor。我们继续进入beanFactory.addBeanPostProcessor方法

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码

beanFactory.addBeanPostProcessor方法会根据BeanPostProcessor所属的类型,将beanFactory的对应属性设置为true,这样做的目的是在其他普通Bean创建时更好的判断是hi否执行对应的后置处理器。然后将BeanPostProcessor放入beanFactorybeanPostProcessor属性中保存。 执行完上面的操作后,我们看一下beanFactory与该功能有关的属性的情况。

23-Spring源码解析之AOP(2)——AnnotationAwareAspectJAutoProxyCreator类源码
对比图四我们可以看到,beanFactorybeanPostProcessor中增加了AnnotationAwareAspectJAutoProxyCreator

至此,文章开头的【问题三】就有了答案。

  • 【问题三】BeanDefinition只是Bean的定义信息,什么时候创建AnnotationAwareAspectJAutoProxyCreator
  • 【答案】:
    • refresh 调用的第六个方法registerBeanPostProcessors中的Ordered区域创建的AnnotationAwareAspectJAutoProxyCreator类对应的Bean
    • 并在创建完Bean后,将该Bean加入到了beanFactorybeanPostProcessor中。

三、总结

本篇文章开头提出的4个问题,在本篇文章中解决了2个。

  • 【问题二】AnnotationAwareAspectJAutoProxyCreator类是什么?它的类结构是什么样子的?
  • 【答案】:
    • AnnotationAwareAspectJAutoProxyCreator是一个BeanPostProcessor
    • AnnotationAwareAspectJAutoProxyCreator也是一个Ordered
    • AnnotationAwareAspectJAutoProxyCreator还是BeanFactoryAware实现类
    • AnnotationAwareAspectJAutoProxyCreator类结构上图可见

  • 【问题三】BeanDefinition只是Bean的定义信息,什么时候创建AnnotationAwareAspectJAutoProxyCreator
  • 【答案】:
    • refresh 调用的第六个方法registerBeanPostProcessors中的Ordered区域创建的AnnotationAwareAspectJAutoProxyCreator类对应的Bean
    • 并在创建完Bean后,将该Bean加入到了beanFactorybeanPostProcessor中。

下一篇文章,我们开始解决最后一个问题:实现AOP功能与AnnotationAwareAspectJAutoProxyCreator类有什么关系。