一文搞懂 Spring Bean 的生命周期,从理论到源码

25 阅读3分钟

一文搞懂 Spring Bean 的生命周期,从理论到源码

一文搞懂 Spring Bean 的生命周期,从理论到源码

参考:Spring Bean 的生命周期是怎么样的?

参考:04-开发框架#Spring Bean 的生命周期

参考:Java 核心技术/37-Spring Bean的生命周期和作用域?.md

典型回答

  • 整个生命周期可以大致分为 3 个大的阶段:创建、使用、销毁。
  • 进一步可以分为 5 个小的阶段:实例化、初始化、注册Destruction回调、Bean的正常使用、Bean的销毁。

image-20250331162206225

  • Bean 加载过程 ---- 抽象层

image-20250331161925874

1、功能列表
  • 序号功能描述类#方法from
    1实例化 BeanSpring 容器首先创建 Bean 实例AbstractAutowireCapableBeanFactory#createBeanlnstanceorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
    2设置属性值Spring 容器注入必要的属性到 Bean 中AbstractAutowireCapableBeanFactory#populateBeanorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
    3检查 Aware如果 Bean 实现了BeanNameAware、BeanClassLoaderAware等这些 Aware 接口,Spring 容器会调用它们。AbstractAutowireCapableBeanFactory#initializeBeanorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
    4调用BeanPostProcessor的前置处理方法在 Bean 初始化之前,允许自定义的 BeanPostProcessor对Bean 实例进行处理,如修改Bean 的状态。BeanPostProcessor 的 postProcessBeforeInitialization方法会在此时被调用。AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforelnitializationorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean
    5调用 InitializingBean 的 afterPropertiesSet 方法提供一个机会,在所有Bean属性设置完成后进行初始化操作。
    如果Bean实现了InitializingBean接口afterPropertiesSet方法会被调用
    AbstractAutowireCapableBeanFactory#invokelnitMethodsorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean
    6调用自定义 init-method 方法提供一种配置方式,在XML配置中指定Bean的初始化方法。如果Bean在配置文件中定义了初始化方法那么该方法会被调用AbstractAutowireCapableBeanFactorry#invokelnitMethodsorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean
    7调用BeanPostProcessor的后置处理方法在 Bean 初始化之后,再次允许BeanPostProcessor对Bean进行处理。BeanPostProcessor的postProcessAfterinitialization方法会在此时被调用。AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterlnitializationorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean
    8注册 Destruction 回调如果Bean实现了DisposableBean接口或在Bean定义中指定了自定义的销毁方法,Spring容器会为这些Bean注册一个销毁回调,确保在容器关闭时能够正确地清理资源。AbstractAutowireCapableBeanFactory#registerDisposableBeanlfNecessaryorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
    9Bean 准备就绪此时,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;
}