Spring Bean的生命周期

(纯属读书笔记,非原创,建议读原文)

深度解析 Spring 源码:探寻Bean的生命周期

Bean 的生命周期的各个阶段

探秘Spring(1)------Bean的生命周期

bean是一个由Spring IoC容器实例化、组装和管理的对象。

一、 Bean生命周期概述

Bean的生命周期包括了定义、实例化、初始化和销毁四个关键阶段,Spring框架在每个阶段都提供了钩子方法,允许开发者在特定的时机执行自定义的逻辑,从而实现对Bean生命周期的定制化管理。

  • Bean的定义阶段: 在这个阶段,Spring会解析Bean的定义,包括从配置文件中读取Bean的元数据,例如类名、属性值、依赖关系等。这个阶段的主要目标是将Bean的定义加载到Spring的应用上下文中。
  • Bean的实例化阶段: 一旦Bean的定义加载到容器中,Spring会根据这些定义创建Bean的实例。这可能涉及到通过构造函数或工厂方法创建实例,并将依赖项注入到Bean中。在这个阶段,Spring会创建Bean的原始对象,并将其放入容器中。
  • Bean的初始化阶段: 在这个阶段,Spring会对Bean进行初始化。这包括执行任何在Bean实例化之后需要执行的定制逻辑,例如调用初始化方法、应用- BeanPostProcessors等。这个阶段是在Bean实例创建完成后、在将Bean实例提供给应用程序之前执行的。
  • Bean的销毁阶段: 最后一个阶段是Bean的销毁。在容器关闭或者特定的销毁时机触发时,Spring会调用Bean的销毁方法,执行清理工作,例如释放资源、关闭连接等。这个阶段是确保Bean在不再需要时能够正确地释放资源。

二、核心拆解:Bean生命周期的11个核心阶段(附阶段流转逻辑)

很多资料把Bean生命周期简化为3-5个阶段,这对实战指导意义不大。结合Spring源码中AbstractAutowireCapableBeanFactory的doCreateBean方法(Bean创建的核心方法),我将其细分为11个连贯阶段,并用"人的一生"做比喻,帮你快速理解:

整体流转:Bean定义加载 → 实例化 → 属性赋值 → Aware接口回调 → BeanPostProcessor前置处理 → 初始化(3种方式) → BeanPostProcessor后置处理 → 使用 → 销毁(3种方式)

三、简化版本

强烈建议读一下这一篇
探秘Spring(1)------Bean的生命周期

本文的主要代码在以下这个类中 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory

  1. 实例化
  2. 回调Aware接口(属性赋值)
  3. 执行初始化
    3.1. BeanPostProcessor的前置处理
    3.2 初始化方法
    3.3 BeanPostProcessor的后置处理
  4. 销毁

六、总结:理解生命周期的核心价值

Bean的生命周期看似复杂,实则是"分层职责、扩展灵活"的设计体现。掌握它的核心价值在于3点:

  • 编写健壮代码:在正确的阶段执行正确的操作(如资源初始化在@PostConstruct,释放在@PreDestroy),避免空指针和资源泄露;

  • 快速故障排查:按生命周期顺序定位问题(如初始化失败→检查属性注入→检查Aware接口→检查初始化方法);

  • 深度定制Spring:通过BeanPostProcessor、Aware接口等扩展点,实现自定义增强(如监控、权限校验、动态代理)。

最后,作为一名学习过程的学者,想分享一句心得:技术之路没有捷径,基础知识点的深度决定了你的技术天花板。Bean生命周期看似基础,却贯穿Spring开发的始终,只有真正理解其原理,才能从"会用Spring"升级到"懂Spring",甚至"定制Spring"。

相关推荐
艾迪的技术之路几秒前
16k 条慢查询,128 张分表,我这么解决
后端·github
dpharness几秒前
我踩过的四个记忆坑,从预算到换机
前端·后端
加宝的起点雷达1 分钟前
三个定时任务被删那天,系统一声不吭
人工智能·后端
泡海椒2 分钟前
jquick-pdf 热力图(HEATMAP)实战:24 格营收矩阵嵌入评级报告的模板逐行拆解
后端
对象存储与RustFS4 分钟前
Velero 接 RustFS 实操:K8s 集群备份落到自建对象存储
后端·docker·云原生
知识搬运临时工6 分钟前
JVM 删掉偏向锁之后,一次无竞争锁从 0.3 纳秒变成 5.4 纳秒
java
leo在掘金8 分钟前
2.8万亿MoE跑昇腾:0 Day适配改了啥
后端·架构
小兔子8 分钟前
proxy_pass 末尾写不写路径,是两套规则:上线后接口路径莫名多了一段
后端
IT枫斗者枫哥11 分钟前
用了BigDecimal还差一分?用四组Java代码查清原因
java·后端
时光不老杰13 分钟前
01 总体架构与模块边界
后端