AnnotationAwareAspectJAutoProxyCreator注册到容器的过程
回顾上一篇
上一篇着重讲了@EnableAspectJAutoProxy的作用,里面主要是通过@Import将AspectJAutoProxyRegistrar由spring容器进行管理,而AspectJAutoProxyRegistrar的主要作用是将AnnotationAwareAspectJAutoProxyCreator注册到BeanDefinitionRegistry,并且beam名称为internalAutoProxyCreator。并分析了AnnotationAwareAspectJAutoProxyCreator的类图结构(如下图),这篇我们开始讲解AnnotationAwareAspectJAutoProxyCreator的作用。
BeanFactoryAware
像Aware这种后缀的接口的作用,一般都是通过容器调用传入一些容器相关的类,让实现这些接口的bean可以直接使用这些容器相关的类,类似于一种回调。关于Aware的详细作用后面有机会我会写另一篇博客来分享。这里大家只要知道大概的作用就行。
通过下图源码,我们可以看到BeanFactoryAware的setBeanFactory方法首先由类AbstractAutoProxyCreator实现,接着被其子类AbstractAdvisorAutoProxyCreator重写实现,而重写实现里面调用了initBeanFactory方法,这个initBeanFactory方法最终又被其子类annotationAwareAspectJAutoProxyCreator重写实现。最终在这个initBeanFactory方法里创建了aspectJAdvisorsBuilder
BeanPostProcessor
BeanPostProcessor称为后置处理器,它的两个方法如下图,作用是在spring容器创建bean的时候,在bean的初始化方法被执行的前后做一些处理,BeanPostProcessor这两个方法的实现就是bean初始化方法执行前后的处理逻辑。
而目前AnnotationAwareAspectJAutoProxyCreator对于这个两个方法的实现是在其父类AbstractAutoProxyCreator中实现的,源码如下图。
AnnotationAwareAspectJAutoProxyCreator注册到容器的过程调试
1,创建ioc容器
这里传入配置类,创建ioc容器,我们进入构造方法查看源码
2,进入创建容器的构造方法
可以看到这里先扫描注册配置类,这一步会根据配置类装配相关bean的beanDefinition到BeanDefinitionRegistry中。接着执行refresh方法容器,这一步会去注册对应bean到spring容器中,我们进入这个方法继续调试
3,进入refresh方法
可以看到refresh方法里面执行了很多步骤,我们要关注AnnotationAwareAspectJAutoProxyCreator的创建过程,而它实现BeanPostProcessor,因此我们要关注代码里面的registerBeanPostProcessors方法,这个方法会去注册实现了BeanPostProcessor的bean到容器中,因此我们继续进入这个方法查看源码
4,进入registerBeanPostProcessors
这里首先获取到所有实现了BeanPostProcessor的beanName,接着根据这些bean实现的不同优先级相关的接口对这些beanName进行了一个分类排序,而AnnotationAwareAspectJAutoProxyCreator由于实现了Ordered接口,因此属于第二优先级队列,接着执行到第二优先级队列时,调用了beanFacoty.getBean方法,顾名思义,这个方法会去创建AnnotationAwareAspectJAutoProxyCreator这个bean,因此从这个方法继续进入观察
从前面的beanFactory.getBean方法一直经历了以下方法调用栈,都是准备要去创建bean的过程,一直来到了这个doCreateBean才开始创建bean的实例,因此我们从这里进去开始看。
5,进入doCreatBean
在doCreatBean方法中,开始创建了AnnotationAwareAspectJAutoProxyCreator,接着为其属性赋值,接着准备去处理这个bean的自定义初始化方法,这个处理在initializeBean方法中实现,因此我们进入这个方法继续观察
6,进入initalizeBean
这里首先会执行invokeAwareMethods方法,在这个方法中,如果bean实现了BeanFactoryAware,则会调用这个bean的setBeanFactory方法。而我们最前面分析过AnnotationAwareAspectJAutoProxyCreator的父类是有实现BeanFactoryAware接口的,因此这里最终会调到AnnotationAwareAspectJAutoProxyCreator的父类的setBeanFactory方法,并最终调到AnnotationAwareAspectJAutoProxyCreator的initBeanFactory方法。最终在这个initBeanFactory方法里创建了aspectJAdvisorsBuilder
处理完上述之后,接着执行所有BeanPostProcessor的前置处理方法,然后执行bean的自定义初始化方法,最后执行所有BeanPostProcessor的后置处理方法
这个initalizeBean方法,我们是以AnnotationAwareAspectJAutoProxyCreator调试为例子来分析。对于其他bean的创建也是一样会经历这个过程,并且AnnotationAwareAspectJAutoProxyCreator本身也是一个BeanPostProcessor,因此对于其他bean的创建,AnnotationAwareAspectJAutoProxyCreator也能起到在其他bean的自定义初始化方法执行的前置处理和后置处理的作用
以下是关于上述补充的源码:执行所有BeanPostProcessor的前置处理方法 和 执行所有BeanPostProcessor的后置处理方法
7,将AnnotationAwareAspectJAutoProxyCreator加入到BeanFactory中
bean创建完之后,最终加入到容器中
下一篇预告
这一篇主要介绍了通过源码分析AnnotationAwareAspectJAutoProxyCreator是如何被注册到spring容器中的。下一篇将介绍AnnotationAwareAspectJAutoProxyCreator的执行时机,也就是它起到的作用