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

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

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

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

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

在这里插入图片描述

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

实例化剩余所有的单实例bean主要在beanFactory.preInstantiateSingletons()方法中
在这里插入图片描述

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

在这里插入图片描述

配置类也是一个bean

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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会存到单例池中。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36602071/article/details/130024500