news 2026/5/3 21:13:59

一张图看懂 Spring Bean 生命周期:从 Instantiation 到 Destruction 的 12 个关键步骤

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一张图看懂 Spring Bean 生命周期:从 Instantiation 到 Destruction 的 12 个关键步骤

🤯 前言:面试官为什么要问这个?

“请你讲一下 Spring Bean 的生命周期。”
当面试官抛出这个问题时,他考的不是你的背诵能力,而是你对Spring 扩展点的理解。

  • AOP 是在哪里介入的?
  • 循环依赖是怎么解决的?
  • @Autowired是什么时候注入的?

如果你只能回答initdestroy,那只能拿 30 分。
今天,我们把 Spring 源码扒光,总结出标准的 12 个关键步骤。记住这张图,面试时直接在白板上画出来,稳拿 Offer!


🗺️ 上帝视角:生命周期全景图

Spring Bean 的生命周期本质上就是:创建 -> 属性赋值 -> 初始化 -> 使用 -> 销毁
但在“初始化”阶段,Spring 埋下了大量的钩子 (Hooks)

核心流程 Mermaid 图解:

销毁阶段 Destruction
初始化阶段 Initialization
检查 Aware 接口
容器关闭
业务使用
11. DisposableBean - destroy
12. destroy-method
6. BeanPostProcessor - Before
7. @PostConstruct
8. InitializingBean - afterPropertiesSet
9. init-method
10. BeanPostProcessor - After
3. BeanNameAware
2. 属性赋值 Populate Properties
4. BeanFactoryAware
5. ApplicationContextAware
开始
1. 实例化 Instantiation
Bean 准备就绪

📝 深度拆解:这 12 步到底在干嘛?

我们将这 12 步分为四个阶段,方便记忆。

第一阶段:无中生有 (实例化)

1. Instantiation (实例化)

  • 动作:Spring 调用构造函数(Constructor)或者工厂方法。
  • 状态:此时的对象只是一个“空壳子”,所有属性都是 null,依赖还没有注入。
第二阶段:填充血肉 (属性赋值)

2. Populate Properties (属性赋值)

  • 动作:Spring 将依赖的对象注入进来(DI)。
  • 细节:处理@Autowired@Value等注解,或者 XML 中的<property>
第三阶段:自我意识觉醒 (Aware 接口)

Bean 开始“认识”自己所处的环境。
3. BeanNameAware

  • 喊话:“把我的名字(id)告诉我!”
    4. BeanFactoryAware
  • 喊话:“把造我的工厂(BeanFactory)给我!”
    5. ApplicationContextAware
  • 喊话:“把整个容器上下文(ApplicationContext)给我!”
第四阶段:初始化 (最重要!扩展点核心)

6. BeanPostProcessor - Before (前置处理)

  • 核心postProcessBeforeInitialization
  • 作用这是 AOP 和动态代理可能介入的第一个时机。你可以对 Bean 进行修改或替换。

7. @PostConstruct

  • 来源:JSR-250 注解。
  • 地位:执行顺序优先于接口和 XML 配置。

8. InitializingBean

  • 动作:调用afterPropertiesSet()方法。
  • 场景:这是硬编码方式的初始化逻辑。

9. init-method

  • 来源:XML<bean init-method="...">@Bean(initMethod = "...")
  • 特点:解耦,不需要实现 Spring 的接口。

10. BeanPostProcessor - After (后置处理)

  • 核心postProcessAfterInitialization
  • 重中之重AOP 动态代理通常是在这一步完成的!如果需要代理,这里返回的就不是原始 Bean,而是 Proxy 对象。
第五阶段:销毁 (落叶归根)

11. DisposableBean

  • 动作:调用destroy()接口。

12. destroy-method

  • 动作:调用自定义销毁方法。

💻 代码实证:口说无凭,Run 一下

我们将所有接口都实现,看看控制台打印的顺序是否一致。

@ComponentpublicclassLifeCycleBeanimplementsBeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean{publicLifeCycleBean(){System.out.println("1. 构造函数 (Instantiation)");}@AutowiredpublicvoidsetService(SomeServiceservice){System.out.println("2. 属性赋值 (Populate Properties)");}@OverridepublicvoidsetBeanName(Stringname){System.out.println("3. BeanNameAware");}@OverridepublicvoidsetBeanFactory(BeanFactorybeanFactory){System.out.println("4. BeanFactoryAware");}@PostConstructpublicvoidpostConstruct(){System.out.println("7. @PostConstruct");}@OverridepublicvoidafterPropertiesSet(){System.out.println("8. InitializingBean");}publicvoidinitMethod(){System.out.println("9. init-method");}@Overridepublicvoiddestroy(){System.out.println("11. DisposableBean");}publicvoiddestroyMethod(){System.out.println("12. destroy-method");}}

控制台输出结果:
(注:步骤 5, 6, 10 需要实现额外的 Processor 才会显示)

1. 构造函数 (Instantiation) 2. 属性赋值 (Populate Properties) 3. BeanNameAware 4. BeanFactoryAware (ApplicationContextAware...) (BeanPostProcessor - Before...) 7. @PostConstruct 8. InitializingBean 9. init-method (BeanPostProcessor - After...) ... 容器关闭 ... 11. DisposableBean 12. destroy-method

🧠 记忆口诀 (面试必杀)

为了防止背了忘,请记住这个**“四字真言”**流程:

建 -> 填 -> 觉 -> 初 -> 销

  1. :实例化 (Constructor)
  2. :填属性 (Setter)
  3. :觉醒 (Aware 接口)
  4. :初始化 (BPP Before -> Init -> BPP After)
  5. :销毁 (Destroy)

最关键的点:记住BeanPostProcessor像两个括号一样,包裹了所有的“初始化方法”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 13:08:59

豆包手机被微信「拒绝」后,阿里系 APP 被曝也禁止其登陆,如何看待这场「博弈」?核心矛盾是什么?

最近&#xff0c;豆包手机成为了全网热议的焦点。这款备受期待的 AI 手机在发布后短短几天内便遭遇了微信、淘宝等主流应用的封禁&#xff0c;不仅如此&#xff0c;其他阿里系应用也接连宣布禁止该设备登录。这一波波的封杀让无数网友感到震惊&#xff0c;更引发了关于技术、商…

作者头像 李华
网站建设 2026/5/3 16:55:59

字节跳动计算机使用智能体技术架构深度解析

字节跳动计算机使用智能体技术架构深度解析 【免费下载链接】UI-TARS-2B-SFT 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/UI-TARS-2B-SFT 在人工智能从语言理解向自主操作演进的关键节点&#xff0c;字节跳动推出的计算机使用智能体&#xff08;Comp…

作者头像 李华
网站建设 2026/5/2 0:24:11

(新卷)产品模块算法检验(Java、Js、c\c++、python)

产品模块算法检验 在产品配置中&#xff0c;一个配置产品是由多个产品模块(CM)构成&#xff0c;每个CM有自身的算法&#xff0c;且模块间可能存在算法依赖。例如电脑产品是由主板、CPU日、显卡等CM构成。CPU模块(CM1)算法依赖主板模块(CM2)算法&#xff0c;记作CM2<-CM1,算法…

作者头像 李华
网站建设 2026/4/18 3:50:25

RTCP: 统计、同步与网络自适应

RTCP: 统计、同步与网络自适应 本文是 WebRTC 系列专栏的第十三篇,将深入剖析 RTCP 协议的工作原理,包括 Sender/Receiver Report、网络质量反馈以及音视频同步机制。 目录 RTCP 概述RTCP 包类型Sender Report (SR)Receiver Report (RR)丢包、带宽与延迟分析音视频同步 (Lip-S…

作者头像 李华
网站建设 2026/4/23 2:32:31

DuckDB嵌入式分析数据库终极指南:快速上手高性能数据处理

DuckDB嵌入式分析数据库终极指南&#xff1a;快速上手高性能数据处理 【免费下载链接】duckdb DuckDB is an in-process SQL OLAP Database Management System 项目地址: https://gitcode.com/GitHub_Trending/du/duckdb 在当今数据驱动的时代&#xff0c;嵌入式分析数据…

作者头像 李华
网站建设 2026/4/25 9:11:27

深入 Flutter 底层:自定义 RenderObject 实现高性能异形列表项

在 Flutter 开发中&#xff0c;我们常通过组合Container、ClipPath、CustomPaint等组件实现异形 UI&#xff08;如弧形背景、不规则卡片&#xff09;&#xff0c;但在列表场景下&#xff0c;这类方案往往存在重绘频繁、性能损耗大的问题。究其根本&#xff0c;是因为常规组件本…

作者头像 李华