Spring 中的 bean 生命周期

🌱 一、什么是 Bean 生命周期?

在 Spring 容器中,一个 Bean 从“创建 → 初始化 → 使用 → 销毁”,经历了完整的生命周期。

Spring 提供了 多个扩展点 让你可以在这些阶段做事情,比如注入资源、日志记录、连接资源、清理工作等等。

🧭 二、完整生命周期流程图

BeanDefinition 加载↓
实例化(new)↓
依赖注入(@Autowired、@Value)↓
Aware 接口(BeanNameAware、ApplicationContextAware)↓
BeanPostProcessor(初始化前)↓
初始化方法(@PostConstruct / InitializingBean.afterPropertiesSet)↓
BeanPostProcessor(初始化后)↓
Bean 准备就绪,可以使用↓
销毁前回调(@PreDestroy / DisposableBean.destroy)↓
Bean 被销毁(容器关闭)

🔧 三、常用生命周期扩展点

阶段使用方式示例
实例化后注入前构造器 / @Autowired构造函数 + 依赖注入
设置 bean 名称BeanNameAware获取当前 Bean 的 ID
设置容器引用ApplicationContextAware拿到整个容器对象
初始化前BeanPostProcessor.postProcessBeforeInitialization()可对 Bean 进行加工
初始化中@PostConstructInitializingBean初始化数据库连接等
初始化后BeanPostProcessor.postProcessAfterInitialization()可返回代理对象
销毁前@PreDestroyDisposableBean清理资源、关闭线程等

✅ 1)@PostConstruct / @PreDestroy(推荐方式)

@Component
public class MyBean {@PostConstructpublic void init() {System.out.println("Bean 初始化完成");}@PreDestroypublic void destroy() {System.out.println("Bean 即将销毁");}
}

✅ 2)实现接口方式(稍显传统)

public class MyBean implements InitializingBean, DisposableBean {public void afterPropertiesSet() {System.out.println("初始化完成");}public void destroy() {System.out.println("销毁前回调");}
}

✅ 3)通过配置指定 initMethod / destroyMethod

@Bean(initMethod = "init", destroyMethod = "cleanup")
public MyBean myBean() {return new MyBean();
}

🧠 四、BeanPostProcessor 的作用?

这是一种非常强大的机制:

你可以在 Bean 初始化前后 对所有 Bean 做增强,比如 AOP、自动代理、注入属性等等。

Spring 的很多高级功能(如 @Transactional@Async)其实都是基于这个机制实现的!

🎯 五、一句话总结

Spring Bean 生命周期 = 一套结构清晰、可定制的生命周期钩子机制,让你能够在合适时机对 Bean 做初始化、增强和清理。

✅ 实战建议

情况用法
需要注入资源后初始化@PostConstruct
需要关闭资源或线程池@PreDestroy
想拦截 Bean 生命周期实现 BeanPostProcessor
需要容器对象实现 ApplicationContextAware
对生命周期感兴趣打开 debug log,跟踪 AbstractAutowireCapableBeanFactory

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

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

相关文章

Media streaming mental map

Media streaming is a huge topic with a bunch of scattered technologies, protocols, and formats. You may feel like hearing fragments without seeing the big picture. Let’s build that mental map together — here’s a high-level overview that connects everyt…

AIDD-深度学习 MetDeeCINE 破译代谢调控机制

深度学习 MetDeeCINE 破译代谢调控机制 目录 使用 FEP/REMD 和 DFT 方法准确预测药物多靶点绝对结合自由能的新途径。Scorpio 框架利用对比学习优化核苷酸序列表示,提升基因组分析效率,尤其在未知序列的分类和泛化能力上表现出色。LPM 模型整合多模态扰…

【2】搭建k8s集群系列(二进制)之安装etcd数据库集群

一、etcd服务架构 Etcd 是一个分布式键值存储系统,Kubernetes 使用 Etcd 进行数据存储,所以先 准备一个 Etcd 数据库,为解决 Etcd 单点故障,应采用集群方式部署,这里使用 3 台组建集群,可容忍 1 台机器故障…

fastGPT—前端开发获取api密钥调用机器人对话接口(HTML实现)

官网文档链接&#xff1a;OpenAPI 介绍 | FastGPT 首先按照文档说明创建api密钥 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

cpp自学 day19(多态)

一、基本概念 同一操作作用于不同的对象&#xff0c;产生不同的执行结果 &#x1f449; 就像「按F1键」&#xff1a;在Word弹出帮助文档&#xff0c;在PS弹出画笔设置&#xff0c;​同一个按键触发不同功能 &#xff08;1&#xff09;多态类型 类型实现方式绑定时机​静态多态…

Java 大视界 -- Java 大数据在航天遥测数据分析中的技术突破与应用(177)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

人脸考勤管理一体化系统(人脸识别系统,签到打卡)

人脸考勤管理一体化系统 项目介绍 本项目是基于Flask、SQLAlchemy、face_recognition库的人脸考勤管理一体化系统。 系统通过人脸识别技术实现员工考勤打卡、人脸信息采集、人脸模型训练等功能。 项目采用前后端分离的技术框架&#xff0c;基于Flask轻量级Web框架搭建后端服务…

单调栈学习C++

目录 一&#xff0c;每日温度 二&#xff0c;下一个更大的元素I 三&#xff0c;下一个更大的元素II 四&#xff0c;接雨水 小结&#xff1a; 单调栈是一种特殊的栈结构&#xff0c;里面的元素按照单调递增或者递减的顺序排列。常用于解决元素左边或者右边比它大或者小的问…

网络钓鱼攻击的威胁和执法部门的作用(第一部分)

在当今的数字世界中&#xff0c;网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段&#xff0c;用于欺骗人们提供敏感信息&#xff0c;例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…

左值与右值,空间与数据

左值是空间&#xff0c;右值是数据 编程总是对“数据”&#xff0c;对"存放数据的空间"操作 a返回一个当前的数据&#xff0c;存放到一个临时空间中&#xff0c;自身的空间中的数据再进行运算 a直接对自身空间中的数据进行运算 其余知识&#xff1a; 1.变量名的意…

无人机飞行术语科普!

一、基础操作类 1. 炸机 指无人机意外坠毁或严重损坏&#xff08;如撞树、撞楼、失控摔机等&#xff09;。 例句&#xff1a;“今天风太大&#xff0c;差点炸机&#xff01;” 2. 一键放生 调侃某些情况下无人机失控飞丢&#xff0c;无法找回&#xff08;源自某些品牌…

模拟算法(一):一维数组模拟

目录 模拟的概念 例1&#xff1a;开关灯 算法思路&#xff1a; 代码如下&#xff1a; 输入输出&#xff1a; 例2&#xff1a;序列操作和查询 算法思路&#xff1a; 代码如下&#xff1a; 输入输出&#xff1a; 例3&#xff1a;数组折叠 算法思路&#xff1a; 代码如…

MySQL 基础入门

写在前面 关于MySQL的下载安装和其图形化软件Navicat的下载安装,网上已经有了很多的教程,这里就不再赘述了,本文主要是介绍了关于MySQL数据库的基础知识。 MySQL数据库 MySQL数据库基础 MySQL数据库概念 MySQL 数据库&#xff1a; 是一个关系型数据库管理系统 。 支持SQL语…

Qt中的多种输出方式,信号与槽的基本使用

完成Hello World可以通过很多控件实现 如采用编辑框来完成hello world 编辑框分为单行编辑框----QLineEdit 和多行编辑框---QTextEdit 采用单行编辑框&#xff0c;创建项目后&#xff0c;展开forms文件夹&#xff0c;双击ui文件进入 qt designer设计页面 找到line edit 拖到页…

英语表达年代和世纪

英语表达年代和世纪 1. Century (世纪)1.1. Start and end of centuries 2. Decade (年代)2.1. Usage 3. 英语表达年代和世纪4. HomeworkReferences XXX0 年代指 XXX0 年 - XXX9 年的连续 10 年&#xff0c;例如 1760 年代指 1760 年至 1769 年这连续 10 年。 XX 世纪 X0 年代…

MySQL数据库管理5

23.事务 1&#xff09;事务&#xff1a;可以认为是做一件事情 需要多个SQL 要么同时成功 要么同时失败 需求&#xff1a;银行转账update 你的账户 把你的钱减少update 你朋友的账户 把他的钱增多​这两个SQL不能只成功一个 要么都成功 要么都失败那么 我们就需要用到事务了 它…

闭包和装饰器

什么是闭包 闭包&#xff08;Closure&#xff09;是 Python 中一个非常重要的概念&#xff0c;它是一种特殊的函数对象&#xff0c;通常用于封装和延迟计算某些值。以下是闭包的详细定义和解释&#xff1a; 1.闭包的定义 闭包是指一个函数对象&#xff0c;它不仅包含函数的代…

notepad++8.6.4安装及细节

notepad8.6.4下载安装&#xff08;附安装包&#xff09; 一、安装包下载1.1方法一&#xff1a;官网下载&#xff08;点击跳转&#xff09;1.2方法二&#xff1a;网盘链接分享8.6.4版本 二、安装过程细节2.1这里的组件建议全部勾选。点击“下一步”。2.2 勾选①&#xff1a;可以…

COZE通关指南:工作流与插件开发

前言 本文隶属于专栏《AI Agent 通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《AI Agent 通关指南》 正文 1. 平台基础介绍 🌟 1.1 COZE平台概述 COZE平台(coze.cn)是一个强大的AI应用开发平台…

【Block总结】ENLTransformerBlock,高效非局部变换器块|即插即用

1. 论文信息 标题: Perspective+ Unet: Enhancing Segmentation with Bi-Path Fusion and Efficient Non-Local Attention for Superior Receptive Fields论文地址: arXiv:2406.14052 2. 创新点 双路径编码策略: 在编码器阶段引入双路径策略,结合传统卷积和空洞卷积的结果,平…