基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机

回顾上一篇

上一篇主要介绍了AnnotationAwareAspectJAutoProxyCreator是如何被注册到spring容器中的,这一篇主要介绍AnnotationAwareAspectJAutoProxyCreator执行的时机,也就是它所起的作用

InstantiationAwareBeanPostProcessor

前面分析过AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator实现了SmartInstantiationAwareBeanPostProcessor,SmartInstantiationAwareBeanPostProcessor的结构如下
基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机
上图的InstantiationAwareBeanPostProcessor通过源码可以看到它定义了下图两个方法
基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机

调试分析AnnotationAwareAspectJAutoProxyCreator的执行时机

1,进入refresh方法

继续上一篇的调试之后,beanPostProcessor被注册到容器之后,接着会调用finishBeanFactoryInitialization方法开始注册剩余的普通的bean到容器中。
基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机

2,进入preInstaniateSingletons

进入上图的finishBeanFactoryInitialization方法后,finishBeanFactoryInitialization方法会继续调用preInstaniateSingletons方法,preInstaniateSingletons主要作用是遍历所有的beanDefinition,进行bean的创建,如果是工厂bean有不一样的逻辑,这里主要分析普通bean的逻辑,因此我们继续进入getBean读源码
基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机

3,进入doGetBean

上图进入getBean,getBean方法里面继续调用了doGetBean方法,getBean里面首先尝试从缓存中获取bean,如果不能获取到,则开始创建bean,这就是spring控制单例bean的方式,这里调试的过程缓存中自然是没有bean的,因此我们继续往下读取创建bean的源码
基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机
在上图doGetBean之后,继续经历了以下方法调用栈,来到了createBean方法
基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机

4,进入createBean

在createBean中,里面有一个resolveBeforeInstantiation方法,这个方法是给所有的BeanPostProcessor一个机会去获取bean的代理对象。如果能拿到代理对象则直接返回。如果不能拿到代理对象,则正常的创建bean,而正常的创建bean的过程doCreateBean方法跟上一篇讲述的doCreateBean是完全一样的过程。这里我们关注获取代理对象方法resolveBeforeInstantiation,因此我们进入这个方法继续查看源码
基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机

5,进入resolveBeforeInstantiation

resolveBeforeInstantiation中调用applyBeanPostProcessorsBeforeInstantiation方法,尝试拿到bean。如果能拿到bean则调用applyBeanPostProcessorsAfterInitialization方法。这里我们继续进入applyBeanPostProcessorsBeforeInstantiation分析。
基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机

6,进入applyBeanPostProcessorsBeforeInstantiation

applyBeanPostProcessorsBeforeInstantiation方法,遍历了所有的beanPostProcessor,如果它属于InstantiationAwareBeanPostProcessor,则执行它的postProcessBeforeInstantiation方法。而前面分析过AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator是有实现了InstantiationAwareBeanPostProcessor,因此AnnotationAwareAspectJAutoProxyCreator在这里是会起作用的,这里就是AnnotationAwareAspectJAutoProxyCreator的执行时机
基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机

7,进入postProcessBeforeInstantiation

调试最终来到了AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator的postProcessBeforeInstantiation方法
基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机

下一篇预告

这一篇讲解了AnnotationAwareAspectJAutoProxyCreator的执行时机,它是在普通bean的创建过程中,尝试创建一个bean的代理对象替代bean去注册到容器中。下一篇将讲解AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator的postProcessBeforeInstantiation方法是如何创建AOP代理对象的。