基于注解式的SpringAOP源码解析-3-AnnotationAwareAspectJAutoProxyCreator注册到容器的过程

18 篇文章 0 订阅
17 篇文章 0 订阅

回顾上一篇

上一篇着重讲了@EnableAspectJAutoProxy的作用,里面主要是通过@Import将AspectJAutoProxyRegistrar由spring容器进行管理,而AspectJAutoProxyRegistrar的主要作用是将AnnotationAwareAspectJAutoProxyCreator注册到BeanDefinitionRegistry,并且beam名称为internalAutoProxyCreator。并分析了AnnotationAwareAspectJAutoProxyCreator的类图结构(如下图),这篇我们开始讲解AnnotationAwareAspectJAutoProxyCreator的作用。
AnnotationAwareAspectJAutoProxyCreator类图
SmartInstantiationAwareBeanPostProcessor

BeanFactoryAware

像Aware这种后缀的接口的作用,一般都是通过容器调用传入一些容器相关的类,让实现这些接口的bean可以直接使用这些容器相关的类,类似于一种回调。关于Aware的详细作用后面有机会我会写另一篇博客来分享。这里大家只要知道大概的作用就行。
通过下图源码,我们可以看到BeanFactoryAware的setBeanFactory方法首先由类AbstractAutoProxyCreator实现,接着被其子类AbstractAdvisorAutoProxyCreator重写实现,而重写实现里面调用了initBeanFactory方法,这个initBeanFactory方法最终又被其子类annotationAwareAspectJAutoProxyCreator重写实现。最终在这个initBeanFactory方法里创建了aspectJAdvisorsBuilder
AbstractAutoProxyCreator
AbstractAdvisorAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator

BeanPostProcessor

BeanPostProcessor称为后置处理器,它的两个方法如下图,作用是在spring容器创建bean的时候,在bean的初始化方法被执行的前后做一些处理,BeanPostProcessor这两个方法的实现就是bean初始化方法执行前后的处理逻辑。
BeanPostProcessor
而目前AnnotationAwareAspectJAutoProxyCreator对于这个两个方法的实现是在其父类AbstractAutoProxyCreator中实现的,源码如下图。
AbstractAutoProxyCreator

AnnotationAwareAspectJAutoProxyCreator注册到容器的过程调试

1,创建ioc容器

这里传入配置类,创建ioc容器,我们进入构造方法查看源码
IOCTest_AOP

2,进入创建容器的构造方法

可以看到这里先扫描注册配置类,这一步会根据配置类装配相关bean的beanDefinition到BeanDefinitionRegistry中。接着执行refresh方法容器,这一步会去注册对应bean到spring容器中,我们进入这个方法继续调试
AnnotationConfigApplicationContext

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的执行时机,也就是它起到的作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值