一文搞懂 Spring Bean 的生命周期,从理论到源码
一文搞懂 Spring Bean 的生命周期,从理论到源码
参考:Java 核心技术/37-Spring Bean的生命周期和作用域?.md
典型回答
- 整个生命周期可以大致分为 3 个大的阶段:创建、使用、销毁。
- 进一步可以分为 5 个小的阶段:实例化、初始化、注册Destruction回调、Bean的正常使用、Bean的销毁。
- Bean 加载过程 ---- 抽象层
1、功能列表
-
序号 功能 描述 类#方法 from 1 实例化 Bean Spring 容器首先创建 Bean 实例 AbstractAutowireCapableBeanFactory#createBeanlnstance org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean 2 设置属性值 Spring 容器注入必要的属性到 Bean 中 AbstractAutowireCapableBeanFactory#populateBean org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean 3 检查 Aware 如果 Bean 实现了BeanNameAware、BeanClassLoaderAware等这些 Aware 接口,Spring 容器会调用它们。 AbstractAutowireCapableBeanFactory#initializeBean org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean 4 调用BeanPostProcessor的前置处理方法 在 Bean 初始化之前,允许自定义的 BeanPostProcessor对Bean 实例进行处理,如修改Bean 的状态。BeanPostProcessor 的 postProcessBeforeInitialization方法会在此时被调用。 AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforelnitialization org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean 5 调用 InitializingBean 的 afterPropertiesSet 方法 提供一个机会,在所有Bean属性设置完成后进行初始化操作。
如果Bean实现了InitializingBean接口afterPropertiesSet方法会被调用AbstractAutowireCapableBeanFactory#invokelnitMethods org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean 6 调用自定义 init-method 方法 提供一种配置方式,在XML配置中指定Bean的初始化方法。如果Bean在配置文件中定义了初始化方法那么该方法会被调用 AbstractAutowireCapableBeanFactorry#invokelnitMethods org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean 7 调用BeanPostProcessor的后置处理方法 在 Bean 初始化之后,再次允许BeanPostProcessor对Bean进行处理。BeanPostProcessor的postProcessAfterinitialization方法会在此时被调用。 AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterlnitialization org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean 8 注册 Destruction 回调 如果Bean实现了DisposableBean接口或在Bean定义中指定了自定义的销毁方法,Spring容器会为这些Bean注册一个销毁回调,确保在容器关闭时能够正确地清理资源。 AbstractAutowireCapableBeanFactory#registerDisposableBeanlfNecessary org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean 9 Bean 准备就绪 此时,Bean已完全初始化,可以开始处理应用程序的请求了。 10 调用 DisposableBean 的destroy 方法 当容器关闭时,如果Bean实现了DisposableBean接口,destroy 方法会被调用。 DisposableBeanAdapter#destroy 11 调用自定义的 destory-method 如果 Bean 在配置文件中定义了销毁方法,那么该方法会被调用, DisposableBeanAdapter#destroy
2、doCreateBean 源码分析
// AbstractAutowireCapableBeanFactory.java
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
// 1. 实例化 Bean
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// do something....
// Initialize the bean instance.
Object exposedObject = bean;
try {
// 2. 设置属性值
populateBean(beanName, mbd, instanceWrapper);
if (exposedObject != null) {
// 3. 检查 Aware
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
catch (Throwable ex) {
// do something ....
}
// Register bean as disposable.
// 8. 注册 Destruction 回调
try {
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
}
return exposedObject;
}
// -----------------------------------------------------
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
invokeAwareMethods(beanName, bean);
return null;
}
}, getAccessControlContext());
}
else {
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
// 4. 调用BeanPostProcessor的前置处理方法
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
// 5. 调用 InitializingBean 的 afterPropertiesSet 方法
// 6. 调用自定义 init-method 方法
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
// 7. 调用BeanPostProcessor的后置处理方法
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}