目录
6. 注册可销毁的 Bean(如果必要)并返回最终的 Bean 实例
Bean 的生命周期是指其在 Spring 容器中从创建到销毁的过程。在 Spring 的源码中,AbstractAutowiredCapableBeanFactory 是用于实现 Bean的自动装配和创建的关键类。它里面的 doCreateBean 方法包含了 Bean生命周期的实现逻辑,源码解释:
1. 获取并创建BeanWrapper实例
首先尝试从缓存(
factoryBeanInstanceCache
)中获取单例模式下的BeanWrapper
实例,如果获取不到(即缓存中不存在或者当前不是单例模式),则通过调用createBeanInstance
方法来创建一个新的BeanWrapper
实例。BeanWrapper
是 Spring 中用于包装 Bean 实例的一个重要接口,它提供了对 Bean 实例的属性访问等功能。
2. 获取 Bean 实例和类型信息(实例化)
从
instanceWrapper
中获取被包装的实际 Bean 实例以及对应的类型信息。如果获取到的类型不是NullBean.class
(表示不是一个空的占位类型),则将该类型信息设置到RootBeanDefinition
(mbd
)的resolvedTargetType
属性中,以便后续使用。
3. 执行合并后的 Bean 定义后置处理器
使用同步块来确保在多线程环境下对mbd
的后置处理操作的一致性。如果当前BeanDefinition
还没有经过后置处理(mbd.postProcessed
为false
),则调用applyMergedBeanDefinitionPostProcessors
方法来应用合并后的 Bean 定义后置处理器。
后置处理器可以对 Bean 定义进行进一步的修改、增强等操作
....忽略
4. 填充 Bean 属性(属性赋值)和初始化 Bean
首先将初始的 Bean 实例赋值给exposedObject
。然后通过populateBean
方法来填充 Bean 的属性,比如通过注入依赖等方式设置 Bean 的各个属性值。接着调用initializeBean
方法对 Bean 进行初始化操作,这可能包括调用Bean
的init
方法等初始化逻辑。
接下来看看具体的initializeBean
方法
4.1 调用 Aware 接口方法
让 Bean 获取到一些关于自身或容器的相关信息:
4.2 应用 Bean 初始化前的后置处理器
调用applyBeanPostProcessorsBeforeInitialization
方法来应用一系列在 Bean 初始化之前需要执行的后置处理器。这些后置处理器可以对 Bean 实例进行一些前置处理,比如修改 Bean 的属性、添加额外的行为等
4.3 调用 Bean 自身的初始化方法
尝试调用 Bean 自身的初始化方法:
继续查看invokeInitMethods方法:
这个方法通常用于在 Bean 的属性设置完成后进行一些额外的初始化操作,比如初始化一些依赖的资源等。
4.4 应用Bean 初始化后的后置处理器
就会调用applyBeanPostProcessorsAfterInitialization
方法来应用一系列在 Bean 初始化之后需要执行的后置处理器。这些后置处理器可以对已经完成初始化的 Bean 实例进行进一步的后置处理,比如添加一些额外的监控逻辑、记录初始化完成后的状态等
5. 对Bean对象进行使用,执行相关业务逻辑
......
6. 注册可销毁的 Bean(如果必要)并返回最终的 Bean 实例
最后,通过registerDisposableBeanIfNecessary
方法注册可销毁的 Bean。如果注册成功,则返回经过上述一系列处理后的最终的exposedObject
,这个对象就是可以在应用中正常使用的完整处理后的 Bean 实例。