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()
方法