一、什么是 Bean 生命周期?

Spring 中的 Bean 生命周期是指一个 Bean 从 被容器创建最终销毁 所经历的一系列过程。

它体现了 Spring IOC 容器在管理 Bean 实例时所执行的各个钩子流程,包括初始化、依赖注入、增强处理、销毁等多个环节。


二、Bean 生命周期完整流程(逻辑顺序)

1. 实例化(Constructor)
2. 属性注入(依赖注入,DI)
3. 感知阶段(Aware 接口)
4. 初始化前处理(BeanPostProcessor#postProcessBeforeInitialization)
5. 初始化(@PostConstruct 或 InitializingBean#afterPropertiesSet)
6. 初始化后处理(BeanPostProcessor#postProcessAfterInitialization)
7. Bean 就绪可用
8. 销毁前处理(@PreDestroy 或 DisposableBean#destroy)

三、生命周期各阶段详细说明


实例化(Instantiation)

  • BeanFactoryApplicationContext 通过 反射调用构造方法 创建 Bean 实例。
  • 此时 Bean 的属性尚未注入。
public class UserService {public UserService() {System.out.println("构造方法执行:Bean 被实例化");}
}

属性注入(依赖注入)

  • Spring 通过反射将依赖的属性注入到实例中。
  • 包括:@Autowired@Value、构造器注入等。

感知接口回调(Aware 接口)

如果 Bean 实现了以下接口,Spring 会注入相关上下文信息:

接口名描述
BeanNameAware获取当前 Bean 的名字
BeanFactoryAware获取当前 BeanFactory 实例
ApplicationContextAware获取当前 ApplicationContext
public class MyBean implements BeanNameAware {@Overridepublic void setBeanName(String name) {System.out.println("BeanNameAware:我的名字是 " + name);}
}

初始化前处理(BeanPostProcessor)

  • Spring 提供的扩展点之一;
  • 所有实现了 BeanPostProcessor 接口的类会在每个 Bean 初始化前后被回调。
public Object postProcessBeforeInitialization(Object bean, String beanName);

初始化(核心)

以下三种初始化方式 Spring 均支持:

方式示例
注解方式@PostConstruct(推荐)
接口方式实现 InitializingBean 接口的 afterPropertiesSet() 方法
XML 配置init-method="init"(在 XML 中显式指定)
@PostConstruct
public void init() {System.out.println("初始化逻辑执行");
}

初始化后处理(BeanPostProcessor)

  • 允许开发者对 Bean 进行增强(如 AOP 就是基于此);
  • 可以返回原 Bean,也可以返回代理对象。
public Object postProcessAfterInitialization(Object bean, String beanName);

Bean 就绪可用

  • Spring 容器完成了 Bean 的初始化,此时可以被应用程序正常使用;
  • Bean 已经具备所有依赖关系,准备投入业务运行。

销毁阶段(Destruction)

Spring 会在容器关闭时销毁单例 Bean:

销毁方式示例
注解方式@PreDestroy(推荐)
接口方式实现 DisposableBean#destroy()
XML 配置destroy-method="destroy"
@PreDestroy
public void cleanup() {System.out.println("Bean 即将销毁,释放资源");
}

注意:默认只销毁单例 Bean,且前提是容器必须正常关闭,如:

((ConfigurableApplicationContext) context).close();

四、完整生命周期流程示意图

构造器实例化 →
属性注入 →
xxxAware 接口 →
postProcessBeforeInitialization →
@PostConstruct / afterPropertiesSet →
postProcessAfterInitialization →
应用使用 →
@PreDestroy / destroy

五、常见问题

Bean 的生命周期中哪个阶段可用于增强?

  • 答:BeanPostProcessor 是关键,它可以包裹原始 Bean,进行代理或包装。

Bean 是什么时候被创建的?

  • 默认是容器启动时(单例 Bean)
  • 如果是 @Lazyprototype,则是 首次使用时

Bean 销毁时会自动释放资源吗?

  • 只会执行自定义的 destroy() 方法或 @PreDestroy
  • 对于像数据库连接、线程池等,需要手动在销毁钩子中关闭资源。

六、总结一

Spring Bean 的生命周期涵盖:创建 → 初始化 → 可用 → 销毁 全流程。通过实现各种接口或使用注解(如 @PostConstruct@PreDestroy),可以在各阶段插入自定义逻辑,方便资源初始化与释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86904.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86904.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86904.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 中 std::string 与 QString 的深度剖析

在 C 编程领域,std::string 和 QString 是两种广泛应用的字符串类型,它们在设计理念、功能特性以及适用场景上都呈现出鲜明的特点。本文将从多个维度对这两种字符串类型进行深度剖析,并详细阐述它们之间的相互转化方法。 std::string 是 C 标…

不止于“修补”:我如何用Adobe AI重塑设计与视频叙事流程

最近我深度体验了一把来自英国Parvis School of Economics and Music的Adobe正版教育订阅,在把玩PhotoShop、Premiere Pro这些“老伙计”的新功能时,的确挖到了一些宝藏,觉得非常有必要与大家说道说道。首先得聊聊这个订阅给我的直观感受&…

重头开始学ROS(5)---阿克曼底盘的URDF建模与Gazebo控制(使用Xacro优化)

阿克曼底盘的URDF建模与Gazebo控制(使用Xacro优化) 阿克曼底盘建模 建模 我们使用后轮驱动,前轮转向的阿克曼底盘模型。 那么对于后轮只需进行正常的continous joint连接即可 对于前轮,有两个自由度,旋转和转向&…

RabbitMq中启用NIO

✅ 所属类 com.rabbitmq.client.ConnectionFactory🧠 使用背景 RabbitMQ Java 客户端默认使用传统的 阻塞 I/O (java.net.Socket) 实现。如果你希望: 更好地控制 线程数获得更好的 并发性能降低 每个连接的线程占用在高并发连接或消费者数量较多的系统…

[Dify]-基础篇2- 如何注册并快速上手 Dify 平台

在生成式 AI 应用开发新时代,如何快速搭建一个高效、可维护、易上线的 AI 工具,是每位开发者关注的核心。Dify,正是为此而生的一站式平台。本篇将以新手视角,带你从注册账号、配置环境,到构建应用、部署上线,手把手完成你的第一个 AI 项目。 注册并设置工作环境 1. 账号…

Java面试宝典:基础七

153. 如何实现对象克隆? 答: 对象克隆有两种主要方式: 浅克隆:实现Cloneable接口并重写Object.clone() class Person implements Cloneable {String name;Car car; // 引用类型@Override

spring-security原理与应用系列:requestMatchers和authorizeRequests

目录 简单示例 WebSecurityConfig requestMatchers ​​​​​​​requestMatchers ​​​​​​​antMatchers ​​​​​​​chainRequestMatchers ​​​​​​​setMatchers ​​​​​​​requestMatcher ​​​​​​​WebSecurity ​​​​​​​performBuild…

Bessel位势方程求解步骤

问题 考虑偏微分方程(PDE): − Δ u u f , x ∈ R n , -\Delta u u f, \quad x \in \mathbb{R}^n, −Δuuf,x∈Rn, 其中 f ∈ L 2 ( R n ) f \in L^2(\mathbb{R}^n) f∈L2(Rn)。这是一个线性椭圆型方程,称为 Bessel 位势方…

if __name__ == ‘__main__‘:

基本概念 if __name__ __main__: 是一个条件判断语句,用于确定当前模块是作为主程序运行,还是被其他模块导入。 __name__ 变量 __name__ 是Python的一个内置变量,表示当前模块的名称当一个模块被直接运行时,__name__ 的值会被…

浅谈Apache HttpClient的相关配置和使用

Apache HttpClient是由Apache软件基金会维护的一款开源HTTP客户端库,对比最基础的 HttpURLConnection 而言,它的优势时支持连接池管理,拦截器(Interceptor)机制,同步/异步请求支持等能力。 在使用这个组件时&#xff…

【Teensy】在ArduinoIDE中配置Teensy4.1

1.文件——首选项 在其他开发板管理器地址这里添加: https://www.pjrc.com/teensy/package_teensy_index.json 点击确定! 2.安装Teensy(for Arduino IDE…) 按照图中1,2,3操作!可以选择上一个版本(不使用最…

企业自建云概念解读|私有云、专有云、混合云、分布式云、企业云

随着云计算技术逐渐成熟,越来越多的企业开始在本地数据中心自行搭建云平台,满足数据合规、业务性能与连续性、节约成本等多方面的需求。不过,面对多种多样的自建云产品,不少用户会有类似的疑问:自建云等于私有云吗&…

反弹 Shell 升级为全交互终端的两种高效方法

目录 🚀 升级反弹 Shell 为全交互终端:两种高效方法 🛠️ 方法 1:利用 Python pty.spawn 创建伪终端 📋 操作步骤

Hyper-YOLO: When Visual Object Detection Meets Hypergraph Computation论文精读(逐段解析)

Hyper-YOLO: When Visual Object Detection Meets Hypergraph Computation论文精读(逐段解析) 论文地址:https://arxiv.org/abs/2408.04804 CVPR 2024 Yifan Feng, Jiangang Huang, Shaoyi Du, Senior Member, IEEE, Shihui Ying, Jun-Hai Y…

Windows 下配置多个 GitHub 账号的 SSH Key

Windows 下配置多个 GitHub 账号的 SSH Key 假设你有以下两个 SSH key 文件: 第一个账号:id_rsa(默认)第二个账号:id_rsa_github ✅ 步骤:在 Windows 上配置多个 GitHub 账号 SSH Key 1️⃣ 打开 SSH 配…

技术选型:时序数据库(三)

IoTDB vs InfluxDB vs TDengine 时序数据库横评对比。 从 架构设计、性能、功能、生态、适用场景 等维度,对三款时序数据库进行深度对比,助您精准选型。 一、核心架构对比 数据库 存储模型 数据模型 扩展性 Apache IoTDB 分层存储(TsFi…

电子电路原理第十九章(非线性运算放大器电路的应用)

单片集成运算放大器价格便宜、用途广泛且性能可靠。它们不仅可以用于线性电路,如电压放大器、电流源和有源滤波器,而且可以用于非线性电路,如比较器、波形生成器和有源二极管电路。非线性运放电路的输出通常与输入信号的波形不同,这是因为运放在输入周期的某个时间段内达到…

FPGA实现CameraLink视频解码转SDI输出,基于LVDS+GTX架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、CameraLink协议理论学习3、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目FPGA实现CameraLink视频编解码方案本博已有的 SDI 编解码方案 4、工程详细设计方案工程设计原理框图输入CameraLink相机LVDS视频解码模块LV…

户外人像要怎么拍 ?

前言: ” 接上篇,培养你的眼力 - 摄影构图,本文是整理自《美国纽约摄影学院 摄影教材》,第三单元 - 第9课 - 自然光,课后习题及解答。“ 1. 正面光产生无深浅反差的平面感觉。 理解这题,首先得明白什么是…

华为云Flexus+DeepSeek征文 | 华为云 ModelArts Studio 赋能高情商AI聊天助手:用技术构建有温度的智能对话体验

前言 华为云 ModelArts Studio 是基于 ModelArts 构建的一站式大模型即服务平台(MaaS),可通过与开源 Agent 框架 Dify.AI 结合来开发对接 AI 聊天助手。 在打造 “高情商” 特性的过程中,华为云ModelArts Studio 的自定义提示词…