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

Spring SmartLifecycle:精准控制Bean的生命周期

一、核心作用

SmartLifecycle 是 Spring 框架中用于 精确控制组件生命周期阶段 的高级接口,主要解决三类问题:

  1. 有序启停:控制多个组件启动/关闭顺序
  2. 阶段化处理:将初始化/销毁操作划分为不同阶段
  3. 上下文感知:获取应用上下文状态变化事件

二、典型应用场景

场景具体用途优势体现
连接池管理数据库/Redis连接池的预热和优雅关闭避免连接泄漏
线程池控制异步线程池的初始化与任务排空防止任务丢失
外部服务注册服务注册中心的上线通知与下线注销保证服务状态一致性
定时任务调度分布式任务调度器的启动与暂停精准控制任务执行周期
硬件设备控制IoT设备连接初始化与安全断开保障设备操作安全性

三、核心方法详解

public interface SmartLifecycle extends Lifecycle {// 关键方法1:启动组件(自动触发)void start();// 关键方法2:停止组件(带异步通知)default void stop(Runnable callback) {stop();callback.run();}// 关键方法3:相位控制(数值越小优先级越高)int getPhase();// 其他方法boolean isAutoStartup();boolean isRunning();
}

四、实战代码示例

基本案例:

@Component
public class DatabaseConnector implements SmartLifecycle {private volatile boolean running = false;private ConnectionPool pool;@Overridepublic void start() {if (!running) {this.pool = initConnectionPool(); // 连接池预热running = true;}}@Overridepublic void stop() {if (running) {pool.safeRelease(); // 安全释放连接running = false;}}@Overridepublic int getPhase() {return Integer.MIN_VALUE + 1000; // 高优先级组件}
}

主动结束当前线程的处理案例:

@Slf4j
@Configuration
public class SensitiveWordsConfiguration implements SmartLifecycle {/*** lifeRunning*/private volatile boolean lifeRunning = false;/*** 更新时间间隔*/private static final long UPDATE_TIME_SECONDS = 10 * 60;/*** 是否终止线程*/private volatile boolean threadStop = false;/*** taskExecutor*/@Autowiredprivate ThreadPoolTaskExecutor taskExecutor;/*** 当前线程任务*/private Future<?> future;/*** 实现热更新,修改词典后自动加载*/private void startScheduledUpdate() {while (!threadStop && !Thread.currentThread().isInterrupted()) {try {log.debug("SensitiveWordConfig#startScheduledUpdate start update...");//这里做业务处理//...TimeUnit.SECONDS.sleep(UPDATE_TIME_SECONDS);} catch (InterruptedException e) {log.info("SensitiveWordConfig#startScheduledUpdate interrupted: {}", e.getMessage());Thread.currentThread().interrupt();break;}}}@Overridepublic void start() {// 启动定时更新任务线程this.future = taskExecutor.submit(this::startScheduledUpdate);lifeRunning = true;}@Overridepublic void stop() {threadStop = true;// 主动终止当前线程的(否则会持续sleep直到线程池shutdownNow导致占用停止时间)this.future.cancel(true);lifeRunning = false;}@Overridepublic boolean isRunning() {return lifeRunning;}}

要特别注意的是:这个案例中使用了spring上下文中的 ThreadPoolTaskExecutor,所以不能使用 @PreDestroy 注解方法来进行回收处理,因为spring在关闭容器时会先对上下问中的线程池进行shutdown完成后,才会执行所有bean的destroy方法。

五、相位控制策略

通过 getPhase() 返回值控制执行顺序:

  • 启动顺序:相位值 从小到大 执行
  • 关闭顺序:相位值 从大到小 执行

六、与普通Lifecycle的区别

特性LifecycleSmartLifecycle
自动启动❌ 需手动触发✅ 支持自动启动
停止回调❌ 无✅ 带异步完成通知
执行顺序控制❌ 不支持✅ 相位值精确控制
上下文刷新集成❌ 有限支持✅ 深度集成上下文生命周期

七、注意事项

  1. 异常处理:在start()/stop()中必须捕获异常,避免阻断全局生命周期流程
  2. 线程安全:确保实现类方法的线程安全性
  3. 性能影响:避免在生命周期方法中执行耗时操作(>1秒的操作建议异步化)
  4. 容器兼容:与@PostConstruct/@PreDestroy注解配合使用时注意执行顺序。执行顺序 @PostConstruct > start() > stop() > @PreDestroy

通过合理使用 SmartLifecycle,可以实现 服务零中断重启资源按序回收 等高级功能,是构建企业级 Spring 应用的必备技能。


(END)

相关文章:

Spring SmartLifecycle:精准控制Bean的生命周期

一、核心作用 SmartLifecycle 是 Spring 框架中用于 精确控制组件生命周期阶段 的高级接口&#xff0c;主要解决三类问题&#xff1a; 有序启停&#xff1a;控制多个组件启动/关闭顺序阶段化处理&#xff1a;将初始化/销毁操作划分为不同阶段上下文感知&#xff1a;获取应用上…...

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析②】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase02 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月15日 关键词&#xff1a;UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-002测试用例 用例ID测试场景验证要点参考条款预期…...

gitee SSH 公钥设置教程

Gitee 提供了基于 SSH 协议的 Git 服务,在使用 SSH 协议访问仓库仓库之前,需要先配置好账户 SSH 公钥。 1、生成秘钥 Windows 用户建议使用 Windows PowerShell 或者 Git Bash,在 命令提示符 下无 cat 和 ls 命令。 ssh-keygen -t ed25519 -C "Gitee SSH Key"中间…...

Wireshark 输出 数据包列表本身的值

在 Wireshark 中&#xff0c;如果你想输出数据包列表本身的值&#xff08;例如&#xff0c;将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式&#xff09;&#xff0c;可以使用 导出为纯文本文件 的功能。以下是详细步骤&#xff1a; 步骤 1&#xff1a;打开 Wir…...

electron 学习

文章目录 1.注意项1.1 安装前最好设置一下代理 官网 tutorial https://www.electronjs.org/docs/latest/tutorial/tutorial-prerequisites 1.注意项 1.1 安装前最好设置一下代理 npm config set registry https://registry.npmmirror.com/...

Asp.Net Core MVC 中级开发教程

Asp.Net Core MVC 中级开发教程 一、Asp.Net Core Mvc 区域使用 ASP.NET Core MVC的Areas使用整理 - 天马3798 - 博客园 二、Asp.Net Core 路径处理 Asp.Net Core Web相对路径、绝对路径整理 Asp.Net Core获取当前上下文对象 三、Asp.Net Core 服务使用和封装 四、Asp.Net …...

DeepSeek与ChatGPT的全面对比

在人工智能&#xff08;AI&#xff09;领域&#xff0c;生成式预训练模型&#xff08;GPT&#xff09;已成为推动技术革新的核心力量。OpenAI的ChatGPT自发布以来&#xff0c;凭借其卓越的自然语言处理能力&#xff0c;迅速占据市场主导地位。然而&#xff0c;近期中国AI初创公…...

什么是网络安全?网络安全防范技术包括哪些?

伴随着互联网的发展&#xff0c;它已经成为我们生活中不可或缺的存在&#xff0c;无论是个人还是企业&#xff0c;都离不开互联网。正因为互联网得到了重视&#xff0c;网络安全问题也随之加剧&#xff0c;给我们的信息安全造成严重威胁&#xff0c;而想要有效规避这些风险&…...

使用Java爬虫获取1688按图搜索商品(拍立淘API接口)

在电商领域&#xff0c;按图搜索商品&#xff08;拍立淘&#xff09;是一种非常实用的功能&#xff0c;尤其适合用户通过图片快速查找相似商品。1688开放平台提供了按图搜索商品的API接口&#xff0c;允许开发者通过图片获取相关的商品信息。本文将详细介绍如何使用Java爬虫技术…...

物联网技术赋能预测性维护的深度剖析与前景展望

一、引言 1.1 研究背景与意义 随着信息技术的飞速发展,物联网技术已逐渐渗透到各个行业领域,成为推动产业变革和创新的重要力量。物联网通过将各种设备、物品与互联网连接,实现数据的采集、传输和交互,为各行业带来了前所未有的智能化和自动化水平提升。在工业领域,设备…...

前端工程化的具体实现细节

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Dav_笔记14:优化程序提示 HINTs -4

指定全局表提示 指定表的提示通常是指发生提示的DELETE&#xff0c;SELECT或UPDATE查询块中的表&#xff0c;而不是指语句引用的任何视图中的表。 如果要为显示在视图中的表指定提示&#xff0c;Oracle建议使用全局提示&#xff0c;而不是在视图中嵌入提示。 您可以使用包含具…...

解锁享元模式:内存优化与性能提升的关键密码

系列文章目录 待后续补充~~~ 文章目录 一、享元模式初相识二、享元模式的核心概念2.1 内部状态与外部状态2.2 享元角色剖析 三、Java 代码中的享元模式3.1 简单示例代码实现3.2 代码解析与关键步骤 四、实际应用场景探秘4.1 文本编辑器中的享元模式4.2 游戏开发中的享元模式4.3…...

负载均衡 方式

DNS 软件负载均衡 Nginx 也是 软件负载均衡 各种策略 1、轮询&#xff08;默认&#xff09; 2、weight&#xff08;权重&#xff09; 3、IP Hash &#xff08;会话粘滞&#xff09; 4、fair 5、UrlHash...

CAS单点登录(第7版)18.日志和审计

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 日志和审计 Logging 概述 Logging CAS 提供了一个日志记录工具&#xff0c;用于记录重要信息事件&#xff0c;如身份验证成功和失败;可以对其进行自定义以生成用于故障排除的其他信息。…...

Linux多版本管理工具介绍

一、update-alternatives工具 1. 简介 update-alternatives是Linux系统自带的一个用于管理多个版本命令的工具。它允许用户在不同的软件版本之间进行切换&#xff0c;而不需要手动修改环境变量或者链接文件。 2. 基本使用 查看已安装的alternatives 使用命令update-alterna…...

DeepSeek笔记(二):DeepSeek局域网访问

如果有多台电脑&#xff0c;可以通过远程访问&#xff0c;实现在局域网环境下多台电脑共享使用DeepSeek模型。在本笔记中&#xff0c;首先介绍设置局域网多台电脑访问DeepSeek-R1模型。 一、启动Ollama局域网访问 1.配置环境变量 此处本人的操作系统是Windows11&#xff0c;…...

摄像头畸变矫正

简单介绍 所谓畸变其实就是由摄像头引起的图片失真, 一般在广角摄像头表现明显, 原本平整的桌面通过镜头看像个球面, 直观的解释直线被拍成了曲线, 这让我想起来了一个表情包. 去畸变的办法 首先我们需要一个标准棋盘(印有特定的标定图案), 如图: 把它摊平放在桌子上, 然后用…...

EasyRTC:智能硬件适配,实现多端音视频互动新突破

一、智能硬件全面支持&#xff0c;轻松跨越平台障碍 EasyRTC 采用前沿的智能硬件适配技术&#xff0c;无缝对接 Windows、macOS、Linux、Android、iOS 等主流操作系统&#xff0c;并全面拥抱 WebRTC 标准。这一特性确保了“一次开发&#xff0c;多端运行”的便捷性&#xff0c…...

机器视觉--图像的运算(乘法)

一、引言 在图像处理领域&#xff0c;Halcon 是一款功能强大且广泛应用的机器视觉软件库。它提供了丰富的算子和工具&#xff0c;能够满足各种复杂的图像处理需求。图像的乘法运算作为其中一种基础操作&#xff0c;虽然不像一些边缘检测、形态学处理等操作那样被频繁提及&…...

蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)

Day 5&#xff1a;哈希表应用&#xff08;两数之和、重复元素判断&#xff09; 一、哈希表&#xff08;Hash Table&#xff09;基础 1. 什么是哈希表&#xff1f; 哈希表&#xff08;Hash Table&#xff09; 是一种键值对&#xff08;key-value&#xff09;存储的数据结构&…...

Kafka分区管理大师指南:扩容、均衡、迁移与限流全解析

#作者&#xff1a;孙德新 文章目录 分区分配操作(kafka-reassign-partitions.sh)1.1 分区扩容、数据均衡、迁移(kafka-reassign-partitions.sh)1.2、修改topic分区partition的副本数&#xff08;扩缩容副本&#xff09;1.3、Partition Reassign场景限流1.4、节点内副本移动到不…...

vue 接口传formdata

在Vue中&#xff0c;如果你需要向服务器发送FormData对象&#xff0c;通常是为了上传文件或者需要发送表单数据。FormData是一个非常有用的工具&#xff0c;因为它可以直接使用表单元素的值以及文件内容&#xff0c;并以一种浏览器兼容的方式来发送这些数据。下面是如何在Vue中…...

图像处理篇---基本OpenMV图像处理

文章目录 前言1. 灰度化&#xff08;Grayscale&#xff09;2. 二值化&#xff08;Thresholding&#xff09;3. 掩膜&#xff08;Mask&#xff09;4. 腐蚀&#xff08;Erosion&#xff09;5. 膨胀&#xff08;Dilation&#xff09;6. 缩放&#xff08;Scaling&#xff09;7. 旋转…...

DeepSeek预测25考研分数线

25考研分数马上要出了。 目前&#xff0c;多所大学已经陆续给出了分数查分时间&#xff0c;综合往年情况来看&#xff0c;每年的查分时间一般集中在2月底。 等待出成绩的日子&#xff0c;学子们的心情是万分焦急&#xff0c;小编用最近爆火的“活人感”十足的DeepSeek帮大家预…...

数据融合的经典模型:早期融合、中期融合与后期融合的对比

数据融合是处理多源数据时非常重要的技术&#xff0c;尤其是在多模态学习、传感器网络和智能系统中。它的目标是将来自不同来源、不同模态的数据进行有效结合&#xff0c;从而获得更准确、更全面的信息。在数据融合的过程中&#xff0c;不同的融合策略能够在性能、效率和应用场…...

Linux环境Docker使用代理推拉镜像

闲扯几句 不知不觉已经2月中了&#xff0c;1个半月忙得没写博客&#xff0c;这篇其实很早就想写了&#xff08;可追溯到Docker刚刚无法拉镜像的时候&#xff09;&#xff0c;由于工作和生活上的事比较多又在备考软考架构&#xff0c;拖了好久…… 简单记录下怎么做的&#xf…...

LabVIEW用CANopen的设备属性配置与心跳消息和PDO读取

本示例展示了如何通过SDO&#xff08;服务数据对象&#xff09;配置设备属性&#xff0c;以及如何读取从设备周期性发送的心跳消息和PDO&#xff08;进程数据对象&#xff09;消息。通过该示例&#xff0c;可以有效地进行设备配置并实现数据监控&#xff0c;适用于CANopen网络中…...

DeepSeek01-本地部署大模型

一、ollama简介&#xff1a; 什么是 Ollama&#xff1f; Ollama 是一个用于本地部署和管理大模型的工具。它提供了一个简单的命令行界面&#xff0c; 使得用户可以轻松地下载、运行和管理各种大模型。Ollama 支持多种模型格式&#xff0c; 并且可以与现有的深度学习框架&#x…...

python学opencv|读取图像(七十五)人脸识别:Fisherfaces算法和LBPH算法

【1】引言 前序学习进程中&#xff0c;已经掌握了使用Eigenfaces算法进行的人脸识别。相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;七十四&#xff09;人脸识别&#xff1a;EigenFaces算法-CSDN博客 在此基础上&#xff0c;学习剩余两种人脸识别算法&am…...

UMLS数据下载及访问

UMLS数据申请 这个直接在官网上申请即可&#xff0c;记得把地址填全&#xff0c;基本都会拿到lisence。 UMLS数据访问 UMLS的数据访问分为网页访问&#xff0c;API访问以及数据下载后的本地访问&#xff0c;网页访问&#xff0c;API访问按照官网的指示即可&#xff0c;这里主…...

UE_C++ —— Container TArray

目录 一&#xff0c;TArray 二&#xff0c;Creating and Filling an Array 三&#xff0c;Iteration 四&#xff0c;Sorting 五&#xff0c;Queries 六&#xff0c;Removal 七&#xff0c;Operators 八&#xff0c;Heap 九&#xff0c;Slack 十&#xff0c;Raw Memor…...

第435场周赛:奇偶频次间的最大差值 Ⅰ、K 次修改后的最大曼哈顿距离、使数组包含目标值倍数的最少增量、奇偶频次间的最大差值 Ⅱ

Q1、奇偶频次间的最大差值 Ⅰ 1、题目描述 给你一个由小写英文字母组成的字符串 s 。请你找出字符串中两个字符的出现频次之间的 最大 差值&#xff0c;这两个字符需要满足&#xff1a; 一个字符在字符串中出现 偶数次 。另一个字符在字符串中出现 奇数次 。 返回 最大 差值…...

模拟解决哈希表冲突

目录 解决哈希表冲突原理&#xff1a; 模拟解决哈希表冲突代码&#xff1a; 负载因子&#xff1a; 动态扩容&#xff1a; 总结&#xff1a; HashMap和HashSet的总结&#xff1a; 解决哈希表冲突原理&#xff1a; 黑色代表一个数组&#xff0c;当 出现哈希冲突时&#xff0…...

UIView 与 CALayer 的联系和区别

今天说一下UIView 与 CALayer 一、UIView 和 CALayer 的关系 在 iOS 开发中&#xff0c;UIView 是用户界面的基础&#xff0c;它负责处理用户交互和绘制内容&#xff0c;而 CALayer 是 UIView 内部用于显示内容的核心图层&#xff08;Layer&#xff09;。每个 UIView 内部都有…...

Android 10.0 移除wifi功能及相关菜单

介绍 客户的机器没有wifi功能&#xff0c;所以需要删除wifi相关的菜单&#xff0c;主要有设置-网络和互联网-WLAN,长按桌面设置弹出的WALN快捷方式&#xff0c;长按桌面-微件-设置-WLAN。 修改 Android10 上直接将config_show_wifi_settings改为false,这样wifi菜单的入口就隐…...

电力与能源杂志电力与能源杂志社电力与能源编辑部2024年第6期目录

研究与探索 含电动汽车虚拟电厂的优化调度策略综述 黄灿;曹晓满;邬楠; 643-645663 含换电站的虚拟电厂优化调度策略综述 张杰;曹晓满;邬楠;杨小龙; 646-649667 考虑虚拟负荷研判的V2G储能充电桩设计研究 徐颖;张伟阳;陈豪; 650-654 基于状态估计的电能质量监测…...

简站主题:简洁、实用、SEO友好、安全性高和后期易于维护的wordpress主题

简站主题以其简洁的设计风格、实用的功能、优化的SEO性能和高安全性而受到广泛好评。 简洁&#xff1a;简站主题采用扁平化设计风格&#xff0c;界面简洁明了&#xff0c;提供多种布局和颜色方案&#xff0c;适合各种类型的网站&#xff0c;如个人博客和企业网站。 实用&…...

Redis(高阶篇)03章——缓存双写一致性之更新策略探讨

一、反馈回来的面试题 一图你只要用缓存&#xff0c;就可能会涉及到redis缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性的问题双写一致性&#xff0c;你先动缓存redis还是数据库mysql哪一个&#x…...

【Git】说说Git中开发测试的使用Git分支Git标签的使用场景

一、环境介绍 dev环境&#xff1a;开发环境&#xff0c;外部用户无法访问&#xff0c;开发人员使用&#xff0c;版本变动很大。test环境&#xff1a;测试环境&#xff0c;外部用户无法访问&#xff0c;专门给测试人员使用的&#xff0c;版本相对稳定。pre环境&#xff1a;灰度环…...

Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程

一、简介 Server-Sent Events (SSE) 是HTML5引入的一种轻量级的服务器向浏览器客户端单向推送实时数据的技术。在Spring Boot框架中&#xff0c;我们可以很容易地集成并利用SSE来实现实时通信。 二、依赖添加 在Spring Boot项目中&#xff0c;无需额外引入特定的依赖&#x…...

【Golang学习之旅】Go 语言微服务架构实践(gRPC、Kafka、Docker、K8s)

文章目录 1. 前言&#xff1a;为什么选择Go语言构建微服务架构1.1 微服务架构的兴趣与挑战1.2 为什么选择Go语言构建微服务架构 2. Go语言简介2.1 Go 语言的特点与应用2.2 Go 语言的生态系统 3. 微服务架构中的 gRPC 实践3.1 什么是 gRPC&#xff1f;3.2 gRPC 在 Go 语言中的实…...

数据结构:栈(Stack)及其实现

栈&#xff08;Stack&#xff09;是计算机科学中常用的一种数据结构&#xff0c;它遵循先进后出&#xff08;Last In, First Out&#xff0c;LIFO&#xff09;的原则。也就是说&#xff0c;栈中的元素只能从栈顶进行访问&#xff0c;最后放入栈中的元素最先被取出。栈在很多应用…...

DeepSeek在linux下的安装部署与应用测试

结合上一篇文章&#xff0c;本篇文章主要讲述在Redhat linux环境下如何部署和使用DeepSeek大模型&#xff0c;主要包括ollama的安装配置、大模型的加载和应用测试。关于Open WebUI在docker的安装部署&#xff0c;Open WebUI官网也提供了完整的docker部署说明&#xff0c;大家可…...

Next.js【详解】获取数据(访问接口)

Next.js 中分为 服务端组件 和 客户端组件&#xff0c;内置的获取数据各不相同 服务端组件 方式1 – 使用 fetch export default async function Page() {const data await fetch(https://api.vercel.app/blog)const posts await data.json()return (<ul>{posts.map((…...

pnpm, eslint, vue-router4, element-plus, pinia

利用 pnpm 创建 vue3 项目 pnpm 包管理器 - 创建项目 Eslint 配置代码风格(Eslint用于规范纠错&#xff0c;prettier用于美观&#xff09; 在 设置 中配置保存时自动修复 提交前做代码检查 husky是一个 git hooks工具&#xff08;git的钩子工具&#xff0c;可以在特定实际执行特…...

将jar安装到Maven本地仓库中

将jar安装到Maven本地仓库中 1. 使用 mvn install:install-file 命令模版示例 2.项目中添加依赖 将一个 .jar 文件安装到 Maven 本地仓库中是一个常见的操作&#xff0c;尤其是在你想要在本地测试一个尚未发布到中央仓库的库时。以下是如何将 .jar 文件安装到 Maven 本地仓库的…...

Spring 和 Spring MVC 的关系是什么?

Spring和Spring MVC的关系就像是“大家庭和家里的小书房”一样。 Spring是一个大家庭&#xff0c;提供了各种各样的功能和服务&#xff0c;比如管理Bean的生命周期、事务管理、安全性等&#xff0c;它是企业级应用开发的全方位解决方案。这个大家庭里有很多房间&#xff0c;每个…...

Ollama ModelFile(模型文件)

1. 什么是 Modelfile&#xff1f; Modelfile 是 Ollama 的配置文件&#xff0c;用于定义和自定义模型的行为。通过它&#xff0c;你可以&#xff1a; 基于现有模型&#xff08;如 llama2、mistral&#xff09;创建自定义版本 调整生成参数&#xff08;如温度、重复惩罚&#…...

基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…...