基于注解式的SpringAOP源码解析-4-AnnotationAwareAspectJAutoProxyCreator的执行时机
AnnotationAwareAspectJAutoProxyCreator的执行时机
回顾上一篇
上一篇主要介绍了AnnotationAwareAspectJAutoProxyCreator是如何被注册到spring容器中的,这一篇主要介绍AnnotationAwareAspectJAutoProxyCreator执行的时机,也就是它所起的作用
InstantiationAwareBeanPostProcessor
前面分析过AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator实现了SmartInstantiationAwareBeanPostProcessor,SmartInstantiationAwareBeanPostProcessor的结构如下
上图的InstantiationAwareBeanPostProcessor通过源码可以看到它定义了下图两个方法
调试分析AnnotationAwareAspectJAutoProxyCreator的执行时机
1,进入refresh方法
继续上一篇的调试之后,beanPostProcessor被注册到容器之后,接着会调用finishBeanFactoryInitialization方法开始注册剩余的普通的bean到容器中。
2,进入preInstaniateSingletons
进入上图的finishBeanFactoryInitialization方法后,finishBeanFactoryInitialization方法会继续调用preInstaniateSingletons方法,preInstaniateSingletons主要作用是遍历所有的beanDefinition,进行bean的创建,如果是工厂bean有不一样的逻辑,这里主要分析普通bean的逻辑,因此我们继续进入getBean读源码
3,进入doGetBean
上图进入getBean,getBean方法里面继续调用了doGetBean方法,getBean里面首先尝试从缓存中获取bean,如果不能获取到,则开始创建bean,这就是spring控制单例bean的方式,这里调试的过程缓存中自然是没有bean的,因此我们继续往下读取创建bean的源码
在上图doGetBean之后,继续经历了以下方法调用栈,来到了createBean方法
4,进入createBean
在createBean中,里面有一个resolveBeforeInstantiation方法,这个方法是给所有的BeanPostProcessor一个机会去获取bean的代理对象。如果能拿到代理对象则直接返回。如果不能拿到代理对象,则正常的创建bean,而正常的创建bean的过程doCreateBean方法跟上一篇讲述的doCreateBean是完全一样的过程。这里我们关注获取代理对象方法resolveBeforeInstantiation,因此我们进入这个方法继续查看源码
5,进入resolveBeforeInstantiation
resolveBeforeInstantiation中调用applyBeanPostProcessorsBeforeInstantiation方法,尝试拿到bean。如果能拿到bean则调用applyBeanPostProcessorsAfterInitialization方法。这里我们继续进入applyBeanPostProcessorsBeforeInstantiation分析。
6,进入applyBeanPostProcessorsBeforeInstantiation
applyBeanPostProcessorsBeforeInstantiation方法,遍历了所有的beanPostProcessor,如果它属于InstantiationAwareBeanPostProcessor,则执行它的postProcessBeforeInstantiation方法。而前面分析过AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator是有实现了InstantiationAwareBeanPostProcessor,因此AnnotationAwareAspectJAutoProxyCreator在这里是会起作用的,这里就是AnnotationAwareAspectJAutoProxyCreator的执行时机
7,进入postProcessBeforeInstantiation
调试最终来到了AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator的postProcessBeforeInstantiation方法
下一篇预告
这一篇讲解了AnnotationAwareAspectJAutoProxyCreator的执行时机,它是在普通bean的创建过程中,尝试创建一个bean的代理对象替代bean去注册到容器中。下一篇将讲解AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator的postProcessBeforeInstantiation方法是如何创建AOP代理对象的。