bean的加载
beanFactory.getBean("beanName");
实例化
(1)beanName转换:因为传入的beanName可能是beanName,也可能是别名,也可能是factoryBean,因此需要根据别名或者factoryBean获取到真实的beanName.
(2)调用getSingleton()
获取单例bean:首先检查单例缓存(singletonObjects
)中是否存在,存在则返回;否则检查是否正在创建(singletonsCurrentlyInCreation
)获取对应的ObjectFactory调用getObject获取,否则返回null;
注:默认情况下参数allowEarlyReference为true,表示允许bean未创建完成时提前依赖。
(3)原型模式的依赖检查。
(4)获取ParentBeanFactory
,如果存在则通过它获取bean,否则继续执行:
注:在bean标签中配置了parent属性,且parent bean配置了factory-bean时才会获取到,否则都是null.
(5)标记为已创建,添加入alreadyCreated
中:
(6)将beanDefinition转换为RootBeanDefinition,添加入mergedBeanDefinitions
,并检查是否抽象;
(7)递归加载注册依赖的bean(如果存在):
(8)根据scope执行不同的bean创建过程(此处仅追踪singleton类型):调用getSingleton()
获取单例bean,在第二个参数中回调了createBean()
函数,以下进入getSingleton()
函数:
(9)检查缓存(singletonObjects)中是否存在,存在则返回,否则执行单例bean创建前执行的方法:
该方法中做了两件事:
- 检查是否在创建检查的白名单中;
- 加入
singletonsCurrentlyInCreation
中,表明当前bean处于创建中。
(10)调用ObjectFactory
中的getObject()
,即回调AbstractBeanFactory
的createBean()
方法,以下分析进入回调方法createBean()
函数:
singletonObject = singletonFactory.getObject();
(11)解析bean对应的class:
(12)由RootBeanDefinition
获取需要重写的方法;
(13)执行bean实例化前的解析操作resolveBeforeInstantiation
,解析bean关联的InstantiationAwareBeanPostProcessor
,调用其postProcessBeforeInstantiation()
以及postProcessAfterInitialization
函数:
(14)在此之前的操作都是一些bean实例化前的准备操作,接下来调用doCreateBean
函数,开始真正的创建:
beanInstance = this.doCreateBean(beanName, mbdToUse, args);
(15)调用createBeanInstance()
解析beanClass
,
- 首先判断是否存在
factory-method
,存在则执行对应的工厂方法; - 否则执行
determineConstructorsFromBeanPostProcessors
,判断是否有与bean相关联的InstantiationAwareBeanPostProcessor
,如果存在且是SmartInstantiationAwareBeanPostProcessor
接口的实例,则获取对应的构造器. - 如果满足上一步中获取到的构造器为空,并且
RootBeanDefinition
中的autowireMode
不为3、构造参数为空这几个条件,则调用instantiateBean
函数执行bean的实例化;否则调用autowireConstructor
函数执行实例化。 - 两个参数内部均为通过反射获取构造器,前者适用于无参构造函数,后者适用于存在有参构造函数,因为有参构造函数可能重载,因此需要遍历所有构造器,根据
RootBeanDefinition
中的构造参数列表获取对应的构造器,通过反射创建bean实例。
(16)解析bean关联的BeanPostProcessors
,调用其postProcessMergedBeanDefinition
函数:
(17)判断beanName是否单例、是否允许循环引用、是否处于正在创建的过程中(singletonsCurrentlyInCreation
),如果都满足创建beanName对应的ObjectFactory加入singletonFactories
中,并将beanName加入registeredSingletons
;
属性赋值
(18)此时的bean已经实例化完成,但所有属性值都为空,接下来执行populateBean
方法,调用applyPropertyValues()
为bean设置属性,具体代码就是根据RootbeanDefinition
进行解析,为bean属性依次赋值;
初始化
(19)执行bean的初始化:
- 获取所有与bean关联的
beanProcessor
并依次调用postProcessBeforeInitialization(result, beanName)
; - 如果bean实现了
InitializingBean
接口,则调用其afterPropertiesSet
; - 调用自定义的
init-method
方法(如果存在); - 获取所有与bean关联的
beanProcessor
并依次调用postProcessAfterInitialization(result, beanName)
;
(20)至此beanInstance
创建完成,将其加入singletonObjects
与registeredSingletons
中,并从singletonFactories
和earlySingletonObjects
中移出:
(21)如果bean实现了DisposableBean
接口,则将bean加入disposableBeans
;
(22)执行afterSingletonCreation
清理缓存:
(23)从beanInstance中获取对象时,如果BeanInstance是FactoryBean实例的引用,则解析调用返回其getObject()
方法的返回值;否则直接返回BeanInstance对象;并将获取到的Object加入缓存singletonObjects
: