AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机

文章目录

  • 一、调用refresh()中的finishBeanFactoryInitialization(beanFactory)
  • 二、调用finishBeanFactoryInitialization中的beanFactory.preInstantiateSingletons()
  • 三、调用getBean()->doGetBean()
  • 四、调用getSingleton(String beanName, ObjectFactory singletonFactory)
  • 五、调用createBean(beanName, mbd, args)
  • 六、调用resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd)
  • 七、调用applyBeanPostProcessorsBeforeInstantiation(Class beanClass, String beanName)
  • 八、调用postProcessBeforeInstantiation(Class beanClass, String beanName)
  • 九、回退到createBean()

前面章节已经讲了,@EnableAspectJAutoProxy注解利用AspectJAutoProxyRegistrar给容器中创建并注册了AnnotationAwareAspectJAutoProxyCreator后置处理器,所以后续再创建其他bean时,后置处理器可以拦截这些bean并进行一些处理。

这一章节主要讲AnnotationAwareAspectJAutoProxyCreator拦截其他bean的创建过程

一、调用refresh()中的finishBeanFactoryInitialization(beanFactory)

上一章节注册完所有BeanPostProcessors后,接着会实例化剩余所有的单实例bean

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第1张图片

二、调用finishBeanFactoryInitialization中的beanFactory.preInstantiateSingletons()

实例化剩余所有的单实例bean主要在beanFactory.preInstantiateSingletons()方法中
AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第2张图片

List< String> beanNames = new ArrayList<>(this.beanDefinitionNames);该集合中存了所有bean的名称,for循环会一次遍历该集合进行创建剩余的单实例bean。首先会创建配置类MainConfigOfAOP这个bean。

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第3张图片

配置类也是一个bean

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第4张图片

三、调用getBean()->doGetBean()

doGetBean()前半部分会提前检查单例池中是否注册过该单实例bean。如果注册过,则将该bean包装后直接返回。

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第5张图片

如果单例池中没有,则执行doGetBean()后半部分的getSingleton(String beanName, ObjectFactory singletonFactory)创建bean。

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第6张图片

四、调用getSingleton(String beanName, ObjectFactory singletonFactory)

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第7张图片
AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第8张图片

ObjectFactory singletonFactory参数是一个lambda表达式,当执行singletonFactory.getObject()时,会调用createBean(beanName, mbd, args)方法创建bean。

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第9张图片

五、调用createBean(beanName, mbd, args)

在createBean(beanName, mbd, args)方法中会先获取到bean的定义信息(单例、非抽象的、非懒加载等bean定义信息),再将bean的名称和bean的定义信息传入,准备执行resolveBeforeInstantiation(beanName, mbdToUse)方法。

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第10张图片

六、调用resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd)

resolveBeforeInstantiation(beanName, mbdToUse)方法的作用是给BeanPostProcessors一个机会,是否能返回一个代理对象来替代需要创建的目标对象。

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第11张图片

七、调用applyBeanPostProcessorsBeforeInstantiation(Class beanClass, String beanName)

applyBeanPostProcessorsBeforeInstantiation方法会遍历所有InstantiationAwareBeanPostProcessor类型的BeanPostProcessors,正好AnnotationAwareAspectJAutoProxyCreator就是InstantiationAwareBeanPostProcessor类型的BeanPostProcessors,所以接下来会执行AnnotationAwareAspectJAutoProxyCreator中的postProcessBeforeInstantiation方法。

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第12张图片

实现了InstantiationAwareBeanPostProcessor接口的,都会实现以下几个方法。

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第13张图片

八、调用postProcessBeforeInstantiation(Class beanClass, String beanName)

注意:这里执行的是InstantiationAwareBeanPostProcessor接口中的postProcessBeforeInstantiation,与BeanPostProcessor接口中得postProcessbeforeInitialization是有区别的。因为AnnotationAwareAspectJAutoProxyCreator实现的是SmartInstantiationAwareBeanPostProcessor接口,SmartInstantiationAwareBeanPostProcessor接口又继承了InstantiationAwareBeanPostProcessor接口,所以执行的是postProcessBeforeInstantiation
区别:
postProcessBeforeInstantiation是在实例化bean之前进行拦截,检查是否能返回代理对象代替目标对象的创建;
postProcessbeforeInitialization是在初始化bean之前进行的处理;

所以在这一步就是AnnotationAwareAspectJAutoProxyCreator的执行时机,AnnotationAwareAspectJAutoProxyCreator的作用就是在实例化所有剩余bean之前,会进行拦截,检查是否能返回代理对象。

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第14张图片

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 interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor

九、回退到createBean()

由于第一个创建的bean是MainConfigOfAOP配置类,没有创建过代理对象,所以resolveBeforeInstantiation(beanName, mbdToUse)返回的是null,接着就会执行doCreateBean()方法继续创建对象。doCreateBean()方法的流程跟上一章节中的流程类似,这里不再分析。最终创建完的bean会存到单例池中。

AOP原理 - 深入分析AnnotationAwareAspectJAutoProxyCreator执行时机_第15张图片

你可能感兴趣的:(Spring,java,spring,AOP)