Bean
的创建
Bean
11、
refresh()
方法调用
finishBeanFactoryInitialization()
方法,初始化剩下的所有单实例bean
finishBeanFactoryInitialization()
方法调用
preInstantiateSingletons()
方法实例化剩下的所有单实例bean
首先获取到所有定义的bean,然后依次进行创建和初始化对象
然后遍历所有的bean,获取bean的定义信息
接着会判断当前bean是否不是抽象的,且是否是单实例,而且是否是懒加载的
如果是,则进一步判断当前
bean
是否是
FactoryBean
,即判断是否实现了
FactoryBean
接口的
bean
,如果是工厂bean,就会调用接口中
getObject()
方法来创建对象
如果不是工厂bean就会调用
getBean()
方法来创建对象
getBean()
方法进一步调用doGetBean()方法
拿到bean的名字之后,先调用
getSingleton()
方法获取缓存中的单实例bean,如果能获取到,就说明这个bean之前已经被创建过了,因为所有创建过的单实例bean都会被缓存起来
如果缓存中获取不到,就开始bean的创建对象流程
首先标记当前bean已被创建,防止多线程创建同一个bean
然后获取bean定义信息
接着获取当前bean依赖的其它bean,如果有依赖就会调用
getBean()
方法把依赖的bean先创建出来
如果当前bean单实例bean就会启动单实例bean创建流程,会调用
getSingleton()
方法通过工厂的
getObject()
方法调用
createBean()
来创建bean
createBean()
会先获取bean的定义信息
然后解析bean的类型
createBean()
会调用
resolveBeforeInstantiation()
方法,在实例化之前,让
BeanPostProcessor
先拦截返回代理对象。
正常的
BeanPostProcessor
都是在对象创建完后,初始化前后来进行拦截,而这里的后置处理器是
InstantiationAwareBeanPostProcessor
类型,在创建对象之前就会进行拦截。如果是
InstantiationAwareBeanPostProcessor
类型就会调用
applyBeanPostProcessorsBeforeInstantiation()
方法
applyBeanPostProcessorsBeforeInstantiation()
方法会触发
postProcessBeforeInstantiation()
方法,后置处理器会在创建对象前进行拦截
如果有返回值,就会调用
applyBeanPostProcessorsAfterInitialization()
方法
applyBeanPostProcessorsAfterInitialization()
方法会触发
postProcessAfterInitialization()
方法,在创建对象之后执行拦截处理
如果前面的
resolveBeforeInstantiation()
方法没有返回一个代理对象,就会调用
doCreateBean()
方法返回一个Bean实例
doCreateBean()
会调用
createBeanInstance()
方法创建一个bean实例
createBeanInstance()
方法利用工厂方法或者对象的构造器创建出bean实例
doCreateBean()
方法在调用
createBeanInstance()
方法创建出bean对象之后,可以调用
applyMergedBeanDefinitionPostProcessors()
方法允许后置处理器修改一些bean的定义
applyMergedBeanDefinitionPostProcessors()
方法遍历所有的后置处理器,如果是
MergedBeanDefinitionPostProcessor
类型的,就会调用
postProcessMergedBeanDefinition()
方法
doCreateBean()
方法完成bean的创建之后,会调用
populateBean()
为创建出来的bean进行属性赋值
在赋值之前,会先获取
InstantiationAwareBeanPostProcessor
后置处理器,执行这个类型后置处理器的
postProcessAfterInstantiation()
方法,在实例化之后初始化之前进行拦截处理
然后,继续获取
InstantiationAwareBeanPostProcessor
后置处理器,执行这个类型后置处理器的
postProcessPropertyValues()
方法,返回bean的属性值
最后才调用
applyPropertyValues()
方法应用返回的bean的属性值,利用反射调用
setter
方法进行属性赋值。此时完成属性的赋值工作
完成属性赋值之后,会调用
initializeBean()
方法来初始化bean
initializeBean()
方法会调用
invokeAwareMethods()
方法,执行实现各种
Aware
接口的方法
然后调用
applyBeanPostProcessorsBeforeInitialization()
方法,让后置处理器在bean初始化之前进行拦截
applyBeanPostProcessorsBeforeInitialization()
方法会遍历所有的后置处理器,执行每个后置处理器的
postProcessBeforeInitialization()
方法
初始化之前的后置处理器执行完之后,就会调用
invokeInitMethods()
方法,执行初始化方法
invokeInitMethods()
方法执行bean的初始化操作
初始化结束之后,会调用
applyBeanPostProcessorsAfterInitialization()
方法,执行初始化之后的后置处理器操作
applyBeanPostProcessorsAfterInitialization()
方法遍历所有的后置处理器,执行
postProcessAfterInitialization()
方法
至此bean的初始化完成
初始化执行完成之后,会调用
registerDisposableBeanIfNecessary()
方法注册bean的销毁方法
至此
doCreateBean()
方法执行结束,返回一个bean实例
所有Bean都利用
getBean()
方法创建完成以后,会检查所有的Bean是否实现了
SmartInitializingSingleton
接口,如果是就执行
afterSingletonsInstantiated()
方法