文章目录
- 一、调用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
二、调用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会存到单例池中。