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"。

相关推荐
2601_962071571 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491112 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
东风破_3 小时前
从跨域到 WebSocket:前端跨域方案、SSE 与双向实时通信详解
前端·后端
zww89491114 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
行百里er4 小时前
Gateway 上别硬塞 MVC:DeferredImportSelector 看菜下锅
spring boot·后端·开源
名字还没想好☜5 小时前
Java 遍历时删元素抛 ConcurrentModificationException:fail-fast 原理与三种正确删法
后端
IT_陈寒5 小时前
React Hooks闭包陷阱差点让我加班到凌晨
前端·人工智能·后端
黑马程序员毕设5 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳6 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
码事漫谈6 小时前
本体论,彻底懂
后端