Spring Bean 生命周期

1.核心概念定义

Spring Bean 生命周期:指 Spring 容器中 Bean 从「实例化(创建对象)」→「属性赋值(依赖注入)」→「初始化(自定义逻辑)」→「使用(对外提供服务)」→「销毁(资源清理)」的完整过程,Spring 提供了多个扩展点允许开发人员干预该过程。

2. Bean 生命周期完整流程

2.1 流程总览(可视化)

实例化 Bean(new 对象)

设置 Bean 属性(依赖注入)

调用 BeanNameAware 的 setBeanName 方法

调用 BeanClassLoaderAware 的 setBeanClassLoader 方法

调用 BeanFactoryAware 的 setBeanFactory 方法

调用 ApplicationContextAware 的 setApplicationContext 方法

调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法(前置处理)

调用 InitializingBean 的 afterPropertiesSet 方法

调用自定义 init-method 方法

调用 BeanPostProcessor 的 postProcessAfterInitialization 方法(后置处理)

Bean 就绪,对外提供服务

容器关闭时:调用 DisposableBean 的 destroy 方法

调用自定义 destroy-method 方法

复制代码
graph TD
    A[实例化 Bean(new 对象)] --> B[设置 Bean 属性(依赖注入)]
    B --> C[调用 BeanNameAware 的 setBeanName 方法]
    C --> D[调用 BeanClassLoaderAware 的 setBeanClassLoader 方法]
    D --> E[调用 BeanFactoryAware 的 setBeanFactory 方法]
    E --> F[调用 ApplicationContextAware 的 setApplicationContext 方法]
    F --> G[调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法(前置处理)]
    G --> H[调用 InitializingBean 的 afterPropertiesSet 方法]
    H --> I[调用自定义 init-method 方法]
    I --> J[调用 BeanPostProcessor 的 postProcessAfterInitialization 方法(后置处理)]
    J --> K[Bean 就绪,对外提供服务]
    K --> L[容器关闭时:调用 DisposableBean 的 destroy 方法]
    L --> M[调用自定义 destroy-method 方法]

实例化 Bean(new 对象)

设置 Bean 属性(依赖注入)

调用 BeanNameAware 的 setBeanName 方法

调用 BeanClassLoaderAware 的 setBeanClassLoader 方法

调用 BeanFactoryAware 的 setBeanFactory 方法

调用 ApplicationContextAware 的 setApplicationContext 方法

调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法(前置处理)

调用 InitializingBean 的 afterPropertiesSet 方法

调用自定义 init-method 方法

调用 BeanPostProcessor 的 postProcessAfterInitialization 方法(后置处理)

Bean 就绪,对外提供服务

容器关闭时:调用 DisposableBean 的 destroy 方法

调用自定义 destroy-method 方法

2.2 各阶段详细说明

阶段序号 阶段名称 核心作用 新手易懂解释
1 实例化 Bean 创建 Bean 实例,在内存中分配空间 相当于执行 new UserBean() 创建空对象
2 设置 Bean 属性 为 Bean 的属性赋值(包括依赖注入其他 Bean) 给空对象的 nameage 等属性赋值,或注入 DataSource 等依赖 Bean
3 Aware 接口回调 让 Bean 感知 Spring 容器的核心信息(名称、类加载器、容器实例等) 告诉 Bean:「你的名字是 userBean」「你所属的容器是 ApplicationContext」
4 BeanPostProcessor 前置 初始化前的全局自定义增强,可修改 Bean 属性甚至替换 Bean 初始化前的「钩子函数」,对所有 Bean 生效(可指定过滤)
5 初始化(内置接口) 执行 InitializingBean 接口的 afterPropertiesSet 方法,完成核心初始化逻辑 Spring 内置的初始化入口,属性赋值完成后自动触发
6 初始化(自定义方法) 执行自定义的 init-method 方法,完成业务侧初始化逻辑 开发人员自定义的初始化方法(如加载配置、创建连接池)
7 BeanPostProcessor 后置 初始化后的全局自定义增强,是修改 Bean 的最后机会 初始化完成后的「钩子函数」,可对 Bean 做最终调整
8 Bean 就绪使用 Bean 完成所有初始化,对外提供业务服务 Bean 可以被正常调用,执行 userService.doSomething() 等业务逻辑
9 销毁(内置接口) 容器关闭时执行 DisposableBean 接口的 destroy 方法,清理核心资源 Spring 内置的销毁入口,容器关闭时自动触发
10 销毁(自定义方法) 执行自定义的 destroy-method 方法,完成业务侧资源清理 开发人员自定义的销毁方法(如关闭连接池、释放文件句柄)

3. 实操示例

3.1 环境说明

  • 框架:Spring Boot 2.x/3.x
  • 核心依赖:spring-context(Spring Boot 已自动引入)
  • 实现目标:通过代码验证 Bean 生命周期各阶段的执行顺序

3.2 代码实现

3.2.1 自定义 Bean(包含生命周期钩子)
复制代码
package com.example.demo.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 演示 Bean 生命周期的自定义 Bean
 * 实现多个 Aware 接口、InitializingBean、DisposableBean 接口,覆盖生命周期关键扩展点
 */
@Component
public class LifecycleDemoBean implements
        BeanNameAware, BeanClassLoaderAware, BeanFactoryAware,
        ApplicationContextAware, InitializingBean, DisposableBean {

    private String demoName;

    // 阶段1:实例化 - 构造器
    public LifecycleDemoBean() {
        System.out.println("【1. 实例化】LifecycleDemoBean 构造器执行");
    }

    // 阶段2:属性赋值 - setter 方法
    public void setDemoName(String demoName) {
        this.demoName = demoName;
        System.out.println("【2. 属性赋值】demoName 属性赋值:" + demoName);
    }

    // 阶段3:Aware 回调 - BeanNameAware
    @Override
    public void setBeanName(String beanName) {
        System.out.println("【3. Aware 回调】BeanNameAware - Bean 名称:" + beanName);
    }

    // 阶段3:Aware 回调 - BeanClassLoaderAware
    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("【3. Aware 回调】BeanClassLoaderAware - 类加载器:" + classLoader);
    }

    // 阶段3:Aware 回调 - BeanFactoryAware
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("【3. Aware 回调】BeanFactoryAware - BeanFactory 实例:" + beanFactory);
    }

    // 阶段3:Aware 回调 - ApplicationContextAware
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("【3. Aware 回调】ApplicationContextAware - ApplicationContext 实例:" + applicationContext);
    }

    // 阶段5:初始化 - InitializingBean 接口
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("【5. 初始化】InitializingBean - afterPropertiesSet 方法执行");
    }

    // 阶段6:初始化 - 自定义 init-method
    public void customInitMethod() {
        System.out.println("【6. 初始化】自定义 init-method - customInitMethod 方法执行");
    }

    // 阶段8:业务方法 - Bean 就绪后使用
    public void doBusiness() {
        System.out.println("【8. 服务使用】LifecycleDemoBean 执行业务逻辑:demoName = " + demoName);
    }

    // 阶段9:销毁 - DisposableBean 接口
    @Override
    public void destroy() throws Exception {
        System.out.println("【9. 销毁】DisposableBean - destroy 方法执行");
    }

    // 阶段10:销毁 - 自定义 destroy-method
    public void customDestroyMethod() {
        System.out.println("【10. 销毁】自定义 destroy-method - customDestroyMethod 方法执行");
    }
}
3.2.2 全局 BeanPostProcessor 实现
复制代码
package com.example.demo.processor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 * 自定义 BeanPostProcessor,实现初始化前后的全局处理
 */
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {

    // 阶段4:初始化前置处理
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if ("lifecycleDemoBean".equals(beanName)) {
            System.out.println("【4. BeanPostProcessor】前置处理 - 处理 LifecycleDemoBean");
        }
        return bean; // 返回原 Bean(可替换为新 Bean)
    }

    // 阶段7:初始化后置处理
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if ("lifecycleDemoBean".equals(beanName)) {
            System.out.println("【7. BeanPostProcessor】后置处理 - 处理 LifecycleDemoBean");
        }
        return bean;
    }
}
3.2.3 配置类(可选,替代 @Component)

若不使用 @Component 注解,可通过 @Bean 显式配置 Bean 并指定初始化 / 销毁方法:

复制代码
package com.example.demo.config;

import com.example.demo.bean.LifecycleDemoBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {

    @Bean(initMethod = "customInitMethod", destroyMethod = "customDestroyMethod")
    public LifecycleDemoBean lifecycleDemoBean() {
        LifecycleDemoBean bean = new LifecycleDemoBean();
        bean.setDemoName("测试名称");
        return bean;
    }
}
3.2.4 测试主类
复制代码
package com.example.demo;

import com.example.demo.bean.LifecycleDemoBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class BeanLifecycleApplication {

    public static void main(String[] args) {
        // 1. 启动 Spring 容器,触发 Bean 生命周期
        ConfigurableApplicationContext context = SpringApplication.run(BeanLifecycleApplication.class, args);

        // 2. 获取 Bean 并执行业务方法
        LifecycleDemoBean demoBean = context.getBean(LifecycleDemoBean.class);
        demoBean.doBusiness();

        // 3. 关闭容器,触发 Bean 销毁
        context.close();
    }
}

3.3 执行结果(关键顺序)

复制代码
【1. 实例化】LifecycleDemoBean 构造器执行
【2. 属性赋值】demoName 属性赋值:测试名称
【3. Aware 回调】BeanNameAware - Bean 名称:lifecycleDemoBean
【3. Aware 回调】BeanClassLoaderAware - 类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@xxxx
【3. Aware 回调】BeanFactoryAware - BeanFactory 实例:org.springframework.beans.factory.support.DefaultListableBeanFactory@xxxx
【3. Aware 回调】ApplicationContextAware - ApplicationContext 实例:org.springframework.context.annotation.AnnotationConfigApplicationContext@xxxx
【4. BeanPostProcessor】前置处理 - 处理 LifecycleDemoBean
【5. 初始化】InitializingBean - afterPropertiesSet 方法执行
【6. 初始化】自定义 init-method - customInitMethod 方法执行
【7. BeanPostProcessor】后置处理 - 处理 LifecycleDemoBean
【8. 服务使用】LifecycleDemoBean 执行业务逻辑:demoName = 测试名称
【9. 销毁】DisposableBean - destroy 方法执行
【10. 销毁】自定义 destroy-method - customDestroyMethod 方法执行

4. 常见扩展场景

扩展点 典型使用场景
InitializingBean/init-method 初始化数据库连接池、加载配置文件、初始化缓存等
DisposableBean/destroy-method 关闭数据库连接、释放文件资源、清空缓存等
BeanPostProcessor 全局修改 Bean 属性、添加统一的日志埋点、Bean 代理增强(如 AOP 底层实现)
Aware 接口 获取 Bean 名称、容器实例,实现与 Spring 容器的交互

5. 注意事项

  1. BeanPostProcessor 是全局生效的,需通过 BeanName 过滤避免影响无关 Bean;
  2. 初始化方法(afterPropertiesSet/init-method)执行顺序:afterPropertiesSet 优先于自定义 init-method;
  3. 销毁方法仅在容器正常关闭时触发(如调用 context.close()),非正常关闭(如 kill 进程)不会执行;
  4. 原型(Prototype)Bean 的销毁方法不会被 Spring 容器管理,需开发人员手动调用。

6. 总结

  1. 核心流程:Spring Bean 生命周期的核心是「实例化 → 属性赋值 → 初始化 → 使用 → 销毁」,其中初始化和销毁阶段支持自定义扩展;
  2. 扩展能力:Aware 接口提供容器感知能力,BeanPostProcessor 提供全局 Bean 增强能力,初始化 / 销毁方法提供业务侧自定义逻辑入口;
  3. 实操关键:自定义初始化 / 销毁逻辑时,可选择实现内置接口(InitializingBean/DisposableBean)或配置自定义方法(init-method/destroy-method),后者更解耦,推荐优先使用。
相关推荐
6+h1 小时前
【Spring】Bean的生命周期详解
java·python·spring
冬夜戏雪1 小时前
面经摘录(五)
java·后端·spring
李昊哲小课1 小时前
Python CSV 模块完整教程
java·服务器·python
人道领域2 小时前
苍穹外卖:菜品分页查询与删除功能(保姆级详解)
java·开发语言·数据库·后端·spring
亚马逊云开发者2 小时前
MCP 到底是什么?一篇讲透:协议原理 + Bedrock 实战 + 安全防护
java
0和1的舞者2 小时前
高并发论坛系统:单元测试 + 接口自动化 + 性能测试 + CI/CD 全链路测试报告
java·测试开发·测试工具·jmeter·pytest·测试·测试报告
空空kkk3 小时前
Java基础——代理
java·开发语言
野生技术架构师3 小时前
互联网大厂必备 Java 面试八股文真题解析
java·开发语言·面试
Rsun045513 小时前
synchronized关键字的底层实现
java