跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Bean 生命周期详解

Spring Bean 生命周期包含元数据配置、实例化、依赖注入、Aware 接口回调、BeanPostProcessor 前后处理、初始化及销毁阶段。详细解析了单例 Bean 的核心步骤,包括 Instantiation、Populate Properties、Initialization 等关键节点,并补充了原型作用域和延迟初始化的特殊情况处理,帮助开发者深入理解容器管理 Bean 的全过程。

ByteFlow发布于 2026/3/26更新于 2026/9/1192 浏览
Spring Bean 生命周期详解

Bean 生命周期的详细步骤

文章配图

第一阶段:Bean 的元数据配置与容器启动
  1. 配置元数据:首先,你需要通过 XML、Java 注解(如 @Component, @Service, @Autowired)或 Java 配置类(@Configuration, @Bean)来定义 Bean。
  2. 容器启动:Spring 容器(如 ApplicationContext)启动,加载并解析这些配置元数据,生成每个 Bean 的 BeanDefinition 对象,它包含了创建一个 Bean 所需的所有信息(如类名、作用域、是否懒加载等)。
第二阶段:Bean 的实例化与初始化(核心生命周期)

1. 实例化(Instantiation)

  • 描述:容器首先会调用 Bean 的构造函数(或工厂方法)来创建一个新的实例。此时只是一个简单的 Java 对象,还没有进行依赖注入,我们可以把它比作'新生儿'。
  • 扩展点:无直接扩展点。

2. 依赖注入(Populate Properties)

  • 描述:Spring 根据配置(如 @Autowired, @Value)将所需的依赖注入到 Bean 的对应属性中。这一步填充了 Bean 的'血肉'。
  • 扩展点:无直接扩展点。

3. Aware 接口回调(Aware Interface Injection)

  • 描述:如果 Bean 实现了各种 Aware 接口,Spring 会在此阶段回调相应的方法,将一些容器相关的对象(如 BeanNameAware, BeanFactoryAware, ApplicationContextAware)注入到 Bean 中。
  • 扩展点:
    • BeanNameAware:设置 Bean 的 ID/Name。
    • BeanFactoryAware:设置当前的 BeanFactory。
    • ApplicationContextAware:设置当前的 ApplicationContext(功能最全)。
    • EnvironmentAware:设置 Environment 对象(用于获取配置文件属性)等。

4. BeanPostProcessor 前置处理

  • 描述:这是极其重要的扩展点。所有实现了 BeanPostProcessor 接口的 Bean,它们的 postProcessBeforeInitialization 方法会在这个阶段被调用。它可以对 Bean 进行包装或增强,返回一个可能是代理对象的 Bean。
  • 扩展点:BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName)

5. 初始化(Initialization)

  • 描述:Bean 的'成人礼'。在这个阶段,Bean 的初始化逻辑会被执行。
    • a. InitializingBean 接口:如果 Bean 实现了 InitializingBean 接口,会调用其 afterPropertiesSet() 方法。
    • b. 自定义初始化方法:调用通过 @Bean(initMethod = "...") 或 XML 中 init-method 属性指定的自定义初始化方法。
  • 扩展点:
    • InitializingBean.afterPropertiesSet()
    • 自定义 init-method

6. BeanPostProcessor 后置处理

  • 描述:这是另一个极其重要的扩展点。所有 BeanPostProcessor 的 postProcessAfterInitialization 方法会被调用。Spring AOP 就是基于此实现的。如果一个 Bean 需要被代理,通常在这里返回一个代理对象来包装目标 Bean。
  • 扩展点:BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)

7. Bean 就绪(Ready)

  • 描述:经过以上所有步骤,Bean 已经完全创建、初始化并可能被代理。它被存放在 Spring 容器(单例池)中,可以被应用程序正常获取和使用了。
第三阶段:Bean 的使用与销毁

8. 使用期

  • 描述:在应用程序运行期间,Bean 被其他组件依赖和调用,执行业务逻辑。

9. 销毁(Destruction)

  • 描述:当 Spring 容器(通常是 ApplicationContext)被关闭时,它会开始销毁容器中的所有单例 Bean。
    • a. DisposableBean 接口:如果 Bean 实现了 DisposableBean 接口,会调用其 destroy() 方法。
    • b. 自定义销毁方法:调用通过 @Bean(destroyMethod = "...") 或 XML 中 destroy-method 属性指定的自定义销毁方法。常用于释放资源,如关闭数据库连接、文件句柄等。
  • 扩展点:
    • DisposableBean.destroy()
    • 自定义 destroy-method
特殊情况的处理
  • 作用域(Scope):上述生命周期主要针对单例(Singleton) Bean。对于原型(Prototype) 作用域的 Bean,Spring 容器只负责到第 6 步(初始化完成),之后就将 Bean 交给客户端,不再管理其生命周期,因此不会调用销毁方法。
  • 延迟初始化(Lazy):标记为 @Lazy 的 Bean,只有在第一次被请求时才会触发上述初始化过程,而不是在容器启动时。
总结与记忆技巧

可以把这个过程想象成一个人的一生:

  • 实例化:出生
  • 依赖注入:接受教育,获取生存技能(依赖)
  • Aware 接口:获得身份 ID、认识家庭和社会(容器环境)
  • BeanPostProcessor(前):步入社会前的指导
  • 初始化:举行成人礼,开始独立承担责任
  • BeanPostProcessor(后):步入社会后的包装/历练(可能被'代理')
  • 就绪:成为社会栋梁,贡献力量
  • 销毁:退休,安享晚年,处理身后事

目录

  1. 第一阶段:Bean 的元数据配置与容器启动
  2. 第二阶段:Bean 的实例化与初始化(核心生命周期)
  3. 第三阶段:Bean 的使用与销毁
  4. 特殊情况的处理
  5. 总结与记忆技巧

更多推荐文章

查看全部
  • OpenClaw 多 Agent 协作:串联计算与翻译任务
  • NVIDIA DGX Spark Ubuntu CUDA 13.0 安装 PyTorch GPU 版
  • MySQL 中 CHAR 和 VARCHAR 的区别
  • 用 Self-Instruct 生成微调数据,让开源模型学会写测试用例
  • GitHub Copilot 兼容 OpenAI/Anthropic API 代理工具 copilot-api 使用指南
  • GraphReader:基于图的智能体,增强大型语言模型的长文本处理能力
  • Flutter 完整开发实战详解:从基础环境搭建到核心原理深入
  • Mac 重装与指定版本升级实操
  • C++ STL 容器常用函数与实战技巧
  • 基于 Dify 低代码平台开发 AI 应用:从入门到生产部署
  • 在终端用好 Claude Code:Anthropic AI 代理实战
  • Manacher 算法详解:求解最长回文子串
  • FPGA 开发入门:Vivado 下载与烧录流程详解
  • OpenClaw 浏览器自动化配置与运行状态排查
  • 前端文件上传优化方案:分片与断点续传实现
  • Struts 1 与 Struts 2 的核心区别对比
  • Ubuntu 下安装与配置 AMULE 客户端
  • AI 实现一镜到底视频:从教材插图到 VR 全景教程
  • Mac 与 iPad 无线 Sidecar 连接失败的原因及解决方案
  • Qdrant 向量数据库与 Spring AI/LangChain4J 集成实践

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online