当前位置: 首页 > article >正文

@PostConstruct、@PreDestroy 和 @DependsOn注解的使用和区别

这三个注解是 Spring 容器管理 Bean 生命周期的核心工具。如果把 Bean 比作一个员工那么DependsOn是入职门槛必须签入职合同我才能入职。PostConstruct是入职仪式拿到电脑和账号后开机、登录、准备工作。PreDestroy是离职交接关电脑、交钥匙、保存文档。下面我将结合Spring Boot 实战场景详细拆解这三个注解的用法、原理和避坑指南。1. DependsOn控制“谁先谁后”核心作用强制指定 Bean 的初始化顺序。虽然 Spring 的Autowired能自动解决大部分依赖但在以下场景会失效必须用DependsOn隐式依赖副作用Bean A 没有直接持有 Bean B 的引用没有Autowired但 A 的初始化逻辑依赖于 B 产生的副作用比如 B 往系统属性里放了值或者 B 初始化了某个静态资源/单例注册中心。第三方库 Bean无法修改源码加Autowired但必须等它先启动。实战代码场景CacheManager必须等RedisConfig加载完配置副作用后才能启动但代码里没有直接注入RedisConfig。1import org.springframework.context.annotation.Bean; 2import org.springframework.context.annotation.Configuration; 3import org.springframework.context.annotation.DependsOn; 4import org.springframework.stereotype.Component; 5 6Component 7class RedisConfig { 8 public RedisConfig() { 9 System.out.println(1. RedisConfig 正在加载配置...); 10 try { Thread.sleep(1000); } catch (Exception e) {} // 模拟耗时 11 System.out.println( - RedisConfig 加载完毕); 12 } 13} 14 15Component 16DependsOn(redisConfig) // 【关键】强制 Spring 先创建 redisConfig哪怕没有注入它 17public class CacheManager { 18 19 public CacheManager() { 20 System.out.println(2. CacheManager 正在启动...); 21 // 此时可以确信 RedisConfig 已经初始化完成 22 System.out.println( - CacheManager 启动完毕); 23 } 24}注意值必须是对方的 Bean 名称默认是类名首字母小写如redisConfig。如果指定的 Bean 不存在Spring Boot 启动会直接报错BeanCreationException。2. PostConstruct初始化的“黄金位置”核心作用在 Bean 实例化并且所有依赖注入Autowired完成后执行。这是执行初始化逻辑如连接数据库、加载缓存、启动线程的最佳时机。为什么不用构造方法构造方法执行时Autowired的字段还是null无法使用。实战场景缓存预热应用启动时把热点数据从数据库加载到内存。启动定时任务启动一个后台线程池或调度器。资源检查检查数据库连接、文件路径是否存在。实战代码缓存预热与异步启动这是一个非常典型的 Spring Boot 业务场景。1import org.springframework.beans.factory.annotation.Autowired; 2import org.springframework.stereotype.Service; 3import javax.annotation.PostConstruct; 4import java.util.concurrent.Executors; 5import java.util.concurrent.ScheduledExecutorService; 6import java.util.concurrent.TimeUnit; 7 8Service 9public class DataCacheService { 10 11 Autowired 12 private UserRepository userRepository; // 假设这是数据库操作类 13 14 private ScheduledExecutorService scheduler; 15 16 // 1. 构造方法 17 public DataCacheService() { 18 System.out.println(构造方法此时 userRepository 是 null不能用); 19 } 20 21 // 2. PostConstruct依赖注入已完成可以安全使用 userRepository 22 PostConstruct 23 public void init() { 24 System.out.println(PostConstruct开始加载缓存...); 25 26 // 模拟耗时操作从数据库加载所有用户到内存 27 // ListUser users userRepository.findAll(); 28 System.out.println( - 缓存已加载 模拟数据); 29 30 // 启动后台定时任务每 10 秒刷新一次 31 scheduler Executors.newScheduledThreadPool(1); 32 scheduler.scheduleAtFixedRate(() - { 33 System.out.println( - [后台任务] 正在刷新缓存...); 34 }, 0, 10, TimeUnit.SECONDS); 35 36 System.out.println(PostConstruct初始化完成服务就绪); 37 } 38}3. PreDestroy资源释放的“最后一道防线”核心作用在 Spring 容器关闭前Bean 销毁前执行清理逻辑。核心价值防止内存泄漏保证优雅停机。实战场景关闭线程池防止应用停止后后台线程还在跑。关闭连接关闭数据库连接池、Redis 连接、文件流。数据落盘将内存中的临时统计数据写入数据库。实战代码优雅停机配合上面的DataCacheService我们需要在应用关闭时停止线程池。1import javax.annotation.PreDestroy; 2 3// 接上面的类 4 // ... 5 6 PreDestroy 7 public void destroy() { 8 System.out.println(PreDestroy应用正在关闭正在清理资源...); 9 10 if (scheduler ! null !scheduler.isShutdown()) { 11 scheduler.shutdown(); // 停止接收新任务 12 try { 13 // 等待任务结束最多等 5 秒 14 if (!scheduler.awaitTermination(5, TimeUnit.SECONDS)) { 15 scheduler.shutdownNow(); // 强制关闭 16 } 17 } catch (InterruptedException e) { 18 scheduler.shutdownNow(); 19 Thread.currentThread().interrupt(); 20 } 21 } 22 System.out.println(PreDestroy资源清理完毕再见); 23 }4. 重点JDK 11/17/21 与 Spring Boot 3 的替代方案在 JDK 9 之后javax.annotation模块被移除。Spring Boot 2.x (JDK 8): 使用javax.annotation.PostConstructSpring Boot 3.x (JDK 17/21): 使用jakarta.annotation.PostConstruct如果你不想处理包名问题或者想使用更 Spring 原生的方式可以使用以下替代方案替代方案 1Spring 原生接口无依赖问题这是 Spring 提供的标准接口不依赖任何外部规范完全兼容所有 JDK 版本。1import org.springframework.beans.factory.DisposableBean; 2import org.springframework.beans.factory.InitializingBean; 3import org.springframework.stereotype.Component; 4 5Component 6public class NativeLifecycleBean implements InitializingBean, DisposableBean { 7 8 Override 9 public void afterPropertiesSet() throws Exception { 10 // 替代 PostConstruct 11 System.out.println(InitializingBean: 初始化完成); 12 } 13 14 Override 15 public void destroy() throws Exception { 16 // 替代 PreDestroy 17 System.out.println(DisposableBean: 销毁开始); 18 } 19}替代方案 2EventListener推荐用于全局启动如果你不是要初始化某个 Bean而是想等整个应用启动完Tomcat 就绪再做某事这个比PostConstruct更好因为它解耦了业务逻辑。1import org.springframework.boot.context.event.ApplicationReadyEvent; 2import org.springframework.context.event.EventListener; 3import org.springframework.stereotype.Component; 4 5Component 6public class AppStartupListener { 7 8 EventListener(ApplicationReadyEvent.class) 9 public void onAppReady() { 10 System.out.println( 整个应用已完全启动可以开始接客了); 11 // 适合做发送启动通知、开始消费 MQ 消息 12 } 13}5. 综合避坑指南与注意事项A. 异常处理生死攸关PostConstruct抛异常 启动失败如果这个方法里抛出未捕获的异常比如数据库连不上Spring Boot 会认为应用不可用直接停止启动。建议在方法内部使用try-catch包裹关键逻辑记录日志或者决定是继续运行还是主动System.exit(1)。PreDestroy抛异常 忽略并继续如果销毁方法报错Spring 通常会记录错误日志然后继续销毁下一个 Bean。B. JDK 9 的依赖问题PostConstruct和PreDestroy属于javax.annotation包。JDK 8自带无需配置。JDK 11/17/21已被移除。如果你的项目运行在高版本 JDK 上必须在pom.xml中引入依赖否则会报ClassNotFoundException1dependency 2 groupIdjavax.annotation/groupId 3 artifactIdjavax.annotation-api/artifactId 4 version1.3.2/version 5/dependency(注Spring Boot 2.3 通常通过spring-boot-starter间接管理了这个依赖但如果是纯 Java 项目需注意)C. 执行顺序如果你混用了多种初始化方式它们的执行顺序是固定的构造方法Autowired注入PostConstructInitializingBean.afterPropertiesSet()(Spring 接口)init-method(XML 或 Bean 配置)建议统一使用PostConstruct不要混用否则代码很难维护。D. 静态方法无效PostConstruct只能修饰非静态方法。因为它是针对 Bean 实例对象的而静态方法属于类。E. 单例 vs 多例单例 (Singleton, 默认)PostConstruct在容器启动时执行一次PreDestroy在容器关闭时执行。多例 (Prototype)每次getBean都会执行PostConstruct但Spring 不会管理多例 Bean 的销毁所以PreDestroy不会执行总结表格注解核心用途执行时机常见坑DependsOn强制顺序实例化之前Bean 名称写错导致启动报错PostConstruct资源初始化注入完成后使用前抛异常导致启动失败JDK9 缺依赖PreDestroy资源清理容器关闭前多例 Bean 不执行kill -9杀进程不执行

相关文章:

@PostConstruct、@PreDestroy 和 @DependsOn注解的使用和区别

这三个注解是 Spring 容器管理 Bean 生命周期的核心工具。如果把 Bean 比作一个员工,那么:DependsOn 是入职门槛(必须签入职合同,我才能入职)。PostConstruct 是入职仪式(拿到电脑和账号后,开机…...

Windows热键冲突终极解决方案:Hotkey Detective深度解析

Windows热键冲突终极解决方案:Hotkey Detective深度解析 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 在Wind…...

【无人机三维路径规划】基于瞬态三角哈里斯鹰算法TTHHO实现多无人机协同三维路径规划附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 🍊个人信条:格物致知,完整Matla…...

筑牢水域安全防线:那些值得深思的防溺水之问

每到夏季,溺水事故便进入高发期,一条条鲜活生命的逝去,给无数家庭带来无法磨灭的伤痛。溺水已成为未成年人意外伤害致死的主要原因之一,面对频发的悲剧,我们不得不静下心来,追问那些关乎生命安全的核心问题…...

基于Next.js与AI协同的全栈开发模板深度解析与实践指南

1. 项目概述:一个为现代全栈开发提速的脚手架最近在折腾一个前后端分离的个人项目,从零开始配置环境、搭建框架、集成各种工具链,一套流程下来,少说也得花上大半天。这让我想起了以前在团队里,每次启动新项目&#xff…...

为内部工具集成 Claude Code 并配置 Taotoken 作为后端

为内部工具集成 Claude Code 并配置 Taotoken 作为后端 在企业内部开发流程中,集成智能编程助手能有效提升代码编写与审查的效率。Claude Code 作为一款基于 Anthropic 模型的编程工具,因其对代码逻辑的深度理解能力,常被团队选为辅助开发的…...

Path of Building终极指南:流放之路Build规划神器

Path of Building终极指南:流放之路Build规划神器 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding Path of Building(简称PoB)是《流放…...

降论文AI率实用攻略:7个方法+专业工具高效过审

为什么你的论文总被判定为AIGC疑似? 近些年AI写作工具普及后,很多科研人都遇到了同一个棘手问题:论文AIGC疑似度过高。按照多数高校最新的管理要求,AIGC率超过30%就有可能被认定为AI代写,直接失去答辩资格。 不少同学…...

Flutter+开源鸿蒙实战|校园易生活Day3 闲置市场页面搭建+卡片封装+GetX状态管理+新手避坑指南

Flutter开源鸿蒙实战&#xff5c;校园易生活Day3 闲置市场页面搭建卡片封装GetX状态管理新手避坑指南 欢迎加入开源鸿蒙跨平台社区&#xff1a;https://openharmonycrossplatform.csdn.net <!-- Schema.org 结构化数据 --> <script type"application/ldjson"…...

3步搞定漫画文本识别:MangaOCR日语漫画阅读革命

3步搞定漫画文本识别&#xff1a;MangaOCR日语漫画阅读革命 【免费下载链接】manga-ocr Optical character recognition for Japanese text, with the main focus being Japanese manga 项目地址: https://gitcode.com/gh_mirrors/ma/manga-ocr 你是否曾经面对日文漫画中…...

【高级工程】网络性能与 QoS (Performance QoS) 深度解析

计算机网络核心笔记&#xff1a;网络性能与 QoS (Performance & QoS) 深度解析 在网络流量爆炸的今天&#xff0c;并不是所有的数据包都是平等的。视频会议掉帧&#xff1f;游戏高延迟&#xff1f;这背后都涉及到一个核心概念&#xff1a;服务质量 (Quality of Service, Qo…...

漫画电子化革命:用Kindle Comic Converter打造完美阅读体验

漫画电子化革命&#xff1a;用Kindle Comic Converter打造完美阅读体验 【免费下载链接】kcc KCC (a.k.a. Kindle Comic Converter) is a comic and manga converter for ebook readers. 项目地址: https://gitcode.com/gh_mirrors/kc/kcc 你是否曾经尝试在Kindle上阅读…...

为Hermes Agent配置自定义供应商并指向Taotoken聚合端点的教程

为Hermes Agent配置自定义供应商并指向Taotoken聚合端点的教程 Hermes Agent 是一个流行的智能体开发框架&#xff0c;它允许开发者灵活地配置和使用不同的大模型。当你想通过 Taotoken 平台来统一管理和调用模型时&#xff0c;可以将其配置为 Hermes Agent 的自定义供应商。这…...

Calibre中文路径乱码终极解决方案:如何彻底告别拼音文件名困扰

Calibre中文路径乱码终极解决方案&#xff1a;如何彻底告别拼音文件名困扰 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文&#xff08;中文&#xff09;命名 项目…...

终极缠论分析工具:ChanlunX通达信插件完整使用指南

终极缠论分析工具&#xff1a;ChanlunX通达信插件完整使用指南 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为缠论的手工分析感到头疼吗&#xff1f;面对复杂的K线图&#xff0c;手动绘制笔、段和…...

Agent-Skills 核心能力与实战效能深度评测

在实际开发中&#xff0c;我们常常遇到这样的困境&#xff1a;大模型虽然能言善辩&#xff0c;但一旦涉及具体的文件操作、数据检索或外部工具调用&#xff0c;往往就显得力不从心&#xff0c;要么产生幻觉&#xff0c;要么无法精准执行指令。为了解决这一痛点&#xff0c;Agen…...

初创团队如何借助 Taotoken 实现低成本多模型 AIGC 应用开发

初创团队如何借助 Taotoken 实现低成本多模型 AIGC 应用开发 对于资源有限的初创团队而言&#xff0c;开发一个集成文本生成与代码辅助的 AIGC 应用&#xff0c;既需要快速验证产品原型&#xff0c;又必须严格控制成本。直接对接多家模型厂商意味着需要管理多个账户、密钥和计…...

GJB/Z 299D 可靠性预计软件「文档校正」保姆级教程

一、功能定位与痛点解决 在 GJB/Z 299D-2024 应力分析法可靠性预计报告中&#xff0c;存在大量带下标符号&#xff08;如 πᵢ、λᵦ&#xff09; 的参数&#xff0c;手动设置下标不仅效率极低&#xff0c;还极易出现漏标、错标问题&#xff0c;同时表格对齐混乱也会影响报告的…...

挖到宝!内容审核神器「数字边境」实测:低成本、快接入、超省心

作为做 App / 小程序的开发者&#xff0c;最头疼的就是内容安全—— 怕违规、怕审核慢、怕成本高、怕人工盯不过来。直到我用上数字边境&#xff0c;直接解决所有痛点&#xff0c;真心安利给每一位做内容业务的朋友&#xff01; 官网直达&#xff1a;https://border.hongshuapp…...

为什么头部银行用AISMM替代COBIT?:揭秘金融级云原生治理的4大硬性阈值与3类不可逆降级信号

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AISMM模型与云原生成熟度 AISMM&#xff08;AI-Savvy Modernization Maturity&#xff09;模型是面向AI增强型云原生演进的五阶段评估框架&#xff0c;聚焦组织在智能服务化、自动化治理与弹性架构协同…...

微信自动回复来了!单聊群聊都能用,私域运营终于不累人了

做过私域的人都知道&#xff1a;客户一多&#xff0c;回复就跟不上 要么回得慢&#xff0c;客户跑了&#xff1b;要么漏回&#xff0c;被投诉&#xff1b;要么回复太模板&#xff0c;显得很敷衍现在&#xff0c;一款【私域管理系统】帮你解决这些难题——三大自动回复功能&…...

为什么83%的AISMM自评得分≠监管认可分?——SITS2026圆桌首次披露“评估可信度衰减公式”

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;SITS2026圆桌&#xff1a;AISMM评估的挑战 在SITS2026国际安全技术峰会上&#xff0c;AISMM&#xff08;AI系统成熟度模型&#xff09;评估成为圆桌讨论的核心议题。与会专家一致指出&#xff0c;当前A…...

AISMM模型适配中小团队的7大裁剪法则,92%的早期项目因忽略第5条导致AI投入归零

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AISMM模型在创业公司中的应用 什么是AISMM模型 AISMM&#xff08;Agile Intelligence Strategy Maturity Model&#xff09;是一种融合敏捷开发、数据智能与战略演进的轻量级成熟度框架&#xff0c;专…...

STM32低功耗实战:用PWR模块让你的电池多撑3倍时间(附代码)

STM32低功耗实战&#xff1a;用PWR模块让你的电池多撑3倍时间&#xff08;附代码&#xff09; 在物联网设备和便携式仪器设计中&#xff0c;电池续航往往是决定产品成败的关键因素。我曾参与过一个野外环境监测项目&#xff0c;设备需要在单节18650电池供电下持续工作半年以上。…...

推荐聚乙烯保温钢管找哪个厂家

推荐聚乙烯保温钢管找哪个厂家在众多的工业管道应用场景中&#xff0c;聚乙烯保温钢管凭借其良好的保温性能、抗腐蚀性等优势&#xff0c;成为了许多工程项目的首选。然而&#xff0c;面对市场上众多的厂家&#xff0c;该如何选择一家可靠的聚乙烯保温钢管厂家呢&#xff1f;聚…...

Unpaywall学术解锁神器:3分钟告别付费文献困扰的终极指南

Unpaywall学术解锁神器&#xff1a;3分钟告别付费文献困扰的终极指南 【免费下载链接】unpaywall-extension Firefox/Chrome extension that gives you a link to a free PDF when you view scholarly articles 项目地址: https://gitcode.com/gh_mirrors/un/unpaywall-exten…...

IT 领导者如何衡量 agentic AI 项目的 ROI

作者&#xff1a;来自 Elastic Devin Rhoades 随着组织从生成式 AI 实验阶段迈向运营级部署&#xff0c;一个新的机会正在逐渐清晰&#xff1a;代理式 AI&#xff08;agentic AI&#xff09;。具备感知、决策和行动能力的 AI agent 正在快速普及。根据 Gartner 的数据&#xff…...

AI写教材新玩法!低查重AI创作技巧与工具,轻松编写实用教材!

谁没有过在写教材时面临框架难题的经历呢&#xff1f;面对空空如也的文档&#xff0c;一坐就是半小时&#xff0c;知识点的排列毫无头绪。该先介绍概念&#xff0c;还是先提供实例呢&#xff1f;章节的划分是按逻辑进行&#xff0c;还是根据课时来&#xff1f;无数次的修改后&a…...

qmc-decoder终极指南:一键解锁QQ音乐加密格式,释放你的音乐收藏

qmc-decoder终极指南&#xff1a;一键解锁QQ音乐加密格式&#xff0c;释放你的音乐收藏 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经下载了QQ音乐平台的歌曲&…...

仿Muduo的高并发服务器:LoopThread模块及其ThreadPool模块

本期我们接着深入项目编写 相关代码上传至作者的个人gitee&#xff1a;仿muduo服务器: 本项目致力于实现一个仿造muduo库的简易并发服务器&#xff0c;为个人项目&#xff0c;参考即可喜欢请点个赞谢谢 目录 LoopThread模块 设计思想 源码 LoopThreadPool模块 设计思想 源码…...