上篇文章主要介绍了beanPostProcessor后置处理器如何注册并创建组件的:
AOP源码解析(2)---Spring源码从入门到精通(十九)
前两篇文章是创建后置处理器(如:AnnotationAwareAspectJAutoProxyCreator)的过程,这篇文章开始创建bean。
finishBeanFactoryInitialization创建单实例bean。
beanFactory.preInstantiateSingletons通过bean工厂创建单实例bean。
一、遍历容器中所有 bean,依次创建。
getBean->doGetBean->getSingleton获取单实例bean,这些前面两篇文章都介绍过了,直接就看getSingleton。
二、创建bean
1、先从缓存中获取当前bean,如果能获取到,说明bean已经被创建过,直接使用,否则再创建;(只要被创建好的bean都会被缓存起来,spring保证单实例)
AnnotationAwareAspectJAutoProxyCreator会在所有bean创建之前会有一个拦截,InstantiationAwareBeanPostProcessor会调用postProcessBeforeInstantiation方法。
【AnnotationAwareAspectJAutoProxyCreator会在任何bean创建前尝试返回bean】
2、createBean()
【BeanPostProcessor是在对象创建完成初始化前后调用的。】
【InstantiationAwareBeanPostProcessor在创建对象完成之前用后置处理器判断是否有对象返回】
1)resolveBeforeInstantiation后置处理器里获取对象直接返回,没有获取到,则调用doCreateBean()。这里面有两个方法分别调用postProcessorBeforeInitialization和postProcessorAfterInitialization。
2)doCreateBean,真正创建bean流程。
三、源码图解
如图先用resolveBeforeInstantiation缓存中获取bean。
点进去缓存中获取的方法可以看到,从beanPostProcessor中获取,若有直接返回。若没有从缓存中获取,则正式创建bean,运行doCreateBean方法。开始创建bean之后,就和之前说的那样,先populate组件的信息,在初始化组件,初始化前后会调用postProcessorBeforeInitialization和postProcessorAfterInitialization方法,这两个方法也是循环beanPostProcessor获取组件调用的,并且若遇到null,会直接返回。