当前位置: 首页 > news >正文

Spring Bean 的生命周期到底是什么?

Bean 的生命周期,指的是一个对象在 Spring 容器中,从创建、初始化,到被使用,再到最终销毁所经历的完整过程。

这道题是面试高频题,但很多人备考时习惯去网上找帖子背图。

其实不需要死记硬背,把核心阶段理解透,自然能用自己的话讲清楚。

BeanFactory 接口的源码注释中明确说明,它的实现类应当支持标准的 Bean 生命周期接口,并给出了标准初始化方法及其顺序。

一、源码入口:从 refresh 到 doCreateBean

refresh()流程中,Bean 的创建最终会进入finishBeanFactoryInitialization()

这里会遍历容器中所有需要初始化的 Bean(Bean 名先被收集进beanNames集合),并依次调用getBean()完成实例化。

getBean()内部继续进入doGetBean()

当缓存中不存在目标 Bean 时,会进一步调用createBean(),最终来到真正负责创建对象的doCreateBean()

Spring 源码中很多以 do 开头的方法承担核心执行逻辑,分析源码时通常需要重点关注。

二、实例化:靠反射生成对象

createBeanInstance()的职责就是完成 Bean 实例化。

Spring 底层仍然采用 Java 反射创建对象,本质流程与手写反射一致:

先获取Class对象,再获取构造器,最后通过反射调用构造方法生成实例。

实际代码中多数是无参构造,因此会通过getDeclaredConstructor()获取无参构造器,再交由BeanUtils工具类调用ctor.newInstance()完成实例化。

三、填充属性:populateBean

实例化完成后进入populateBean(),负责为 Bean 注入依赖和属性值。

属性注入完成后,Bean 还不能立即对外提供服务。

接下来进入初始化阶段,这也是 Bean 生命周期最重要的一部分。

四、初始化:Aware、后置处理器与初始化方法

初始化阶段首先处理各种 Aware 接口,例如BeanNameAwareBeanFactoryAware等。

Spring 会把容器相关信息注入 Bean,使其能够感知自身所处的运行环境。

随后执行BeanPostProcessor的前置方法postProcessBeforeInitialization()

之后进入初始化方法:

  • 如果 Bean 实现了InitializingBean接口,会调用afterPropertiesSet()。Bean 的创建全程由容器完成,若需要在属性装配完成后执行收尾逻辑,afterPropertiesSet()是常用的扩展点。
  • 如果配置中指定了init-method,会执行对应的自定义初始化方法,不过这种方式相对少用。

最后执行BeanPostProcessor的后置方法postProcessAfterInitialization()

如果 Bean 需要增强,例如使用 AOP,这一步会返回代理对象,而不是最初创建的原始对象。

初始化方式使用方式推荐程度
InitializingBean实现接口,重写afterPropertiesSet()常用扩展点,属性装配后的收尾机会
init-method配置中指定自定义方法名相对少用

后置方法执行完毕,Bean 的创建流程就全部完成。

五、使用与销毁

初始化完成后,Bean 即可对外提供服务,通过getBean()获取使用。

容器关闭时,Bean 进入销毁阶段,销毁方式与初始化对应:

  • 如果 Bean 实现了DisposableBean接口,会调用destroy()方法,释放资源一类的收尾逻辑通常放在这里。
  • 如果配置中指定了destroy-method,会执行对应的自定义销毁方法,同样相对少用。

需要注意的是,容器只负责单例 Bean 的销毁,prototype 作用域的 Bean 交出实例后便不再归容器管理。


整个 Bean 生命周期可以归纳为下面八个阶段:

实例化(反射生成对象)→ 填充属性 → 调用 Aware 接口 → 执行 BeanPostProcessor 前置 → 初始化(afterPropertiesSet / init-method)→ 执行 BeanPostProcessor 后置(AOP 代理通常在此阶段生成)→ 使用 → 销毁。

http://www.jsqmd.com/news/1311162/

相关文章:

  • 四派混战:中国世界模型的“路线战争”
  • 2026年长宁区注册公司服务机构甄选参考:正规资质与专业能力盘点 - 优质品牌商家
  • 【单片机课设毕设项目】基于 STM32F103C8T6 的多功能交通灯系统设计 基于单片机双屏显示智能交通信号灯控制系统(016101)
  • 单片机毕业设计-基于 STM32 的卫浴红外感应智能控制装置设计 基于单片机的坐具恒温换气消毒智能系统设计(016301)
  • 家政行业正在经历一场‘静默革命’:当零代码遇上千万阿姨,传统派单模式迎来终极解法
  • Unity集成WebRTC视频流:基于WebView插件的跨平台实时播放方案
  • AI如何用符号计算与神经网络攻克粒子物理计算难题
  • 前端跨域 iframe 通信别再手写 postMessage:用 iframe-js 实现 ACK、RPC 与状态同步
  • Android端车牌识别实战:YOLOv5与PlateNet的移动端部署与优化
  • 从威斯康星乳腺癌数据集实战:构建可解释的稳健分类模型
  • Qt QListWidgetItem 核心用法:数据绑定、内存管理与性能优化
  • 【翼型】CFD求解器采用点连续过度松弛PSOR方法NACA 23021翼型上的无粘流动【含Matlab源码 15915期】
  • 2026 年至今,桦甸口碑好的燃气脉冲吹灰器定做厂家哪个好,锅炉积灰堵管全靠它?难怪节能提效不用愁!-金润吹灰器 - 行业甄选官
  • 2026 年更新:雷山可靠的铸铁闸门制造厂家全面解析与选购指南,谁能想到不起眼的老物件,竟是水利工程藏着的关键把关人? - 行业推荐官【认证】
  • 【单片机课设毕设项目】基于嵌入式技术的井下沼气液位智能监测系统 基于 MPU6050 的井盖倾斜检测嵌入式系统实现(016201)
  • Node.js连接SQL Server数据库:从环境配置到CRUD操作实战指南
  • OpenClaw AI智能体框架在奶茶店数字化运营中的落地实践
  • Altium Designer封装设计全解析:从Datasheet解读到BGA实战
  • Unreal Insights性能分析工具:从原理到实战的移动端优化指南
  • 智能体框架如何革新计算化学工作流:从自动化到智能化
  • 工业边缘计算实践:基于树莓派CM4与Ignition Edge的HMI解决方案
  • 099、LLC谐振变换器的大信号建模
  • 大语言模型后训练:离策与在策学习融合实战指南
  • MusicFree插件终极指南:解锁全网免费音乐资源的秘密武器
  • 富士XT-5相机全面上手指南:从核心设定到实战技巧
  • 复指数信号:从欧拉公式到信号处理与系统分析的基石
  • 罗定市卫生间漏水维修_2026粤西广东西关城市漏水维修价格行情与电话 - 雨婺虹房屋维修
  • PyTorch GPU环境配置全攻略:从CUDA驱动到PyCharm集成
  • Unity游戏本地化实战:XUnity Auto Translator自动化翻译与配置指南
  • 基于W5500与reComputer R1000构建BACnet MS/TP边缘网关的完整实践