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

相关推荐
刀法如飞2 小时前
开箱即用的 DDD(领域驱动设计)工程脚手架,基于 Spring Boot 4.0.1 和 Java 21
java·spring boot·mysql·spring·设计模式·intellij-idea
我是苏苏2 小时前
Web开发:C#通过ProcessStartInfo动态调用执行Python脚本
java·服务器·前端
JavaGuide3 小时前
SpringBoot 官宣停止维护 3.2.x~3.4.x!
java·后端
瑶山3 小时前
Spring Cloud微服务搭建一、Nacos配置和服务注册
spring·spring cloud·微服务·nacos
Victor3563 小时前
Hibernate(39)Hibernate中如何使用拦截器?
后端
Victor3563 小时前
Hibernate(40)Hibernate的命名策略是什么?
后端
tkevinjd4 小时前
动态代理
java
Knight_AL4 小时前
Spring 事务管理:为什么内部方法调用事务不生效以及如何解决
java·后端·spring