Spring的SmartLifecycle可以没用过,但没听过就不好了! - 第517篇

历史文章(文章累计500+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

《国内最全的Spring Boot系列之六》

《国内最全的Spring Boot系列之七》

Spring Boot整合ElasticSearch实战 - 第511篇

Transaction rolled back because it has been marked as - 第512篇

五音不全也浪漫,521清华学霸为爱人写歌 - 第513篇

一文讲清楚SpringBoot项目打包jar后运行报错template might not exist - 第514篇

idea springboot woff/woff2/eot/ttf/svg等小图标不显示的问题 - 第515篇

Noisee AI中文站网页版 AI 音乐生成视频全新登场,快来抢先体验——国内第一个登场的中文站来袭  - 516篇

悟纤:师傅,你说有没有更优雅的方式,可以在Spring Boot的启动和关闭的时候进行一些资源的操作呐。

师傅:当然是有了,常用的 一些方式是使用@PostConstruct和@PreDestroy,但在有些场景,资源无法精准的被关停,那么这个时候可以使用SmartLifecycle。

悟纤:师傅,看着很厉害的样子呢 ,那师傅赶紧和我分享一下呗。

师傅:拿起小板凳和隔壁的小姐姐一起学习起来~

导读

最近在开发一个AI音乐项目(地址在下面)的时候,在使用队列的时候,想在程序启动和关闭的时候,对队列进行一些操作,一开始的时候@PostConstruct和@PreDestroy,但还是无法很好的进行关停,后面了解到SmartLifecycle,这个确实很好用。

项目体验地址:https://suno4.cn/#/?i=8NCBS8_WXTT

前言

SpringBoot的应用中,我们通常会利用@PostConstruct@PreDestroy注解,在Bean初始化或销毁时执行一些操作,这些操作都处于Bean声明周期的层面。

然而,在某些情况下,我们可能会遇到一些遗漏的场景,比如希望在容器本身的生命周期事件(如容器启动、停止)上执行一些操作,一个典型的例子就是在Spring Boot中启动内嵌的Web容器。这时候,该如何处理呢?

这就是我们需要利用Spring提供的另一个接口Lifecycle。接下来,我们将介绍一下Lifecycle接口以及比它更智能的SmartLifecycle

接口Lifecycle

在SpringBoot应用中如果没有调用AbstractApplicationContext#start方法,只是实现了Lifecycle接口,是不会执行Lifecycle接口中的启动方法和isRunning方法的。但在应用退出时会执行Lifecycle#isRunning方法判断该Lifecycle是否已经启动,如果返回true则调用Lifecycle#stop()停止方法。

如果使用者没有显式的调用容器的start()和stop()方法,Lifecycle的接口方法不会被执行。

而在一般的项目中,我们很少这样显式的去调用,所以就需要一个更“聪明”的类来处理,这就是SmartLifecycle

接口SmartLifecycle

可以看到SmartLifecy继承了Lifecycle,所以也就拥有了Lifecycle的能力:

start()方法:容器启动后调用

stop()方法:容器停止时调用

isRunning():检查此组件是否正在运行。

(1)只有该方法返回false时,start方法才会被执行。

(2)只有该方法返回true时,stop(Runnable callback)或stop()方法才会被执行。

SmartLifecycle继承自Lifecycle,提供了更丰富的功能:第一,start()方法无需容器显式调用就可以被执行;第二,可以控制多SmartLifecycle实例的执行顺序。

getPhase():如果有多个实现接口SmartLifecycle的类,则这些类的start的执行顺序按getPhase方法返回值从小到大执行。

例如:1比2先执行,-1比0先执行。stop方法的执行顺序则相反,getPhase返回值较大类的stop方法先被调用,小的后被调用。

如何使用呢?很简单

import org.springframework.context.SmartLifecycle;import org.springframework.stereotype.Component;@Componentpublic class MySmartLifecycle implements SmartLifecycle {    private volatile boolean running = false;    /**     * 如果该`Lifecycle`类所在的上下文在调用`refresh`时,希望能够自己自动进行回调,则返回`true`,     * false的值表明组件打算通过显式的start()调用来启动,类似于普通的Lifecycle实现。     * 默认就是true,所以可以不用重写此方法。     *///    @Override//    public boolean isAutoStartup() {//        return true;//    }    /**     * 1. 主要在该方法中启动任务或者其他异步服务,比如开启MQ接收消息<br/>     * 2. 当上下文被刷新(所有对象已被实例化和初始化之后)时,将调用该方法,     * 默认生命周期处理器将检查每个SmartLifecycle对象的isAutoStartup()方法返回的布尔值。     * 如果为“true”,则该方法会被调用,而不是等待显式调用自己的start()方法。     */    @Override    public void start() {        System.out.println("MySmartLifecycle容器启动完成 ...");        running = true;    }    /**     * SmartLifecycle子类的才有的方法,当isRunning方法返回true时,该方法才会被调用。     * 很多框架中的源码中,都会把真正逻辑写在stop()方法内。     * 比如quartz和Redis的spring支持包。     */    @Override    public void stop(Runnable callback) {        System.out.println("MySmartLifecycle容器停止,执行回调函数");        stop();        // 如果你让isRunning返回true,需要执行stop这个方法,那么就不要忘记调用callback.run()。        // 否则在程序退出时,Spring的DefaultLifecycleProcessor会认为这个MySmartLifecycle没有stop完成,程序会一直卡着结束不了,等待一定时间(默认超时时间30秒)后才会自动结束。        callback.run();    }    /**     * 接口Lifecycle子类的方法,只有非SmartLifecycle的子类才会执行该方法。<br/>     * 1. 该方法只对直接实现接口Lifecycle的类才起作用,对实现SmartLifecycle接口的类无效。<br/>     * 2. 方法stop()和方法stop(Runnable callback)的区别只在于,后者是SmartLifecycle子类的专属。     */    @Override    public void stop() {        System.out.println("MySmartLifecycle容器停止 ...");        running = false;    }    /**     * 1. 只有该方法返回false时,start方法才会被执行。<br/>     * 2. 只有该方法返回true时,stop(Runnable callback)或stop()方法才会被执行。     */    @Override    public boolean isRunning() {        System.out.println("MySmartLifecycle检查运行状态 ...");        return running;    }    /**     * 如果有多个实现接口SmartLifecycle的类,则这些类的start的执行顺序按getPhase方法返回值从小到大执行。<br/>     * 例如:1比2先执行,-1比0先执行。stop方法的执行顺序则相反,getPhase返回值较大类的stop方法先被调用,小的后被调用。     *     */    @Override    public int getPhase() {        return 0;    }}

启动的日志打印:

MySmartLifecycle检查运行状态 ...

MySmartLifecycle容器启动完成 ...

关闭的日志打印:

MySmartLifecycle检查运行状态 ...

MySmartLifecycle容器停止,执行回调函数

MySmartLifecycle容器停止 ...

SmartLifecycle使用场景

(1)异步初始化或销毁操作: SmartLifecycle接口允许在容器启动或关闭过程中执行异步操作。这对于需要在应用程序启动或关闭时执行长时间运行的任务或资源清理操作非常有用。

(2)有序启动和关闭: SmartLifecycle可以指定组件的启动和关闭顺序,确保在启动或关闭过程中其他组件已经准备好或者已经完成。当你的组件在启动的时候,有依赖关系的话,那么就可以SmartLifecycle来进行控制组件的启动顺序。

(3)动态决定启动和关闭: SmartLifecycle接口中的方法能够让组件动态地决定何时启动或关闭。这使得在特定条件满足时才启动或关闭组件成为可能,从而提高了系统的灵活性和可控性。

(4)状态管理: SmartLifecycle接口提供了方法来查询组件的当前状态,例如是否已经启动或停止。这对于在应用程序的其他部分中根据组件状态做出决策或执行特定的逻辑非常有用。

(5)资源监控器的启动和停止: 如果应用程序中存在资源监控器,可以使用SmartLifecycle接口来启动和停止这些监控器。在应用程序启动时,监控器可以开始监控资源的使用情况。在应用程序关闭时,可以停止监控器并释放资源。

以下是一些具体的SmartLifecycle接口的应用场景:

(1)数据库连接池的管理: 在应用程序启动时,可以利用SmartLifecycle接口来初始化数据库连接池。在应用程序关闭时,可以利用SmartLifecycle接口来优雅地关闭数据库连接池,确保所有数据库连接都已释放。

(2)缓存的初始化和销毁: 在应用程序启动时,可以使用SmartLifecycle接口来初始化缓存并加载数据。在应用程序关闭时,可以使用SmartLifecycle接口来优雅地销毁缓存并释放资源。

(3)定时任务的管理: 如果应用程序中存在定时任务,可以使用SmartLifecycle接口来启动和关闭这些定时任务。在应用程序启动时,定时任务可以注册并开始执行。在应用程序关闭时,可以优雅地停止定时任务的执行。

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

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

相关文章

three.js开发3D地图记录(一)

关键代码部分&#xff1a; <template><div class"center-map-box" id"contant"></div> </template><script> import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/control…

springboot小型超市商品展销系统-计算机毕业设计源码01635

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

EIQ-ABC 分析法在配送中心储位分配中的应用

配送中心运作效率的高低主要取决于仓储业务流程的作业效率&#xff0c;在配送作业流程中&#xff0c;储位分配的是否合理性成为影响配送运作效率的重要因素。为实现储位的合理分配&#xff0c;提出通过对订单信息的分析&#xff0c;并应用 EIQ-ABC 分析法&#xff0c;以此实现缩…

白酒:茅台镇白酒的品牌合作与跨界营销案例

云仓酒庄豪迈白酒&#xff0c;作为茅台镇的知名品牌&#xff0c;在品牌合作与跨界营销方面也有着杰出的表现。通过与不同领域品牌的合作&#xff0c;豪迈白酒进一步拓宽了市场渠道&#xff0c;提升了品牌曝光度和影响力。 首先&#xff0c;云仓酒庄豪迈白酒与品质餐产品牌的合作…

量子革命 “不负众望“!即将见证首个商业量子应用案例?

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨沛贤/浪味仙 排版丨沛贤 深度好文&#xff1a;1000字丨5分钟阅读 摘要&#xff1a;雀巢、联合利华和德国能源巨头 E.ON 表示&#xff0c;距离首个商用量子案例出现可能只需三年时间。 近…

tracetcp下载 安装 使用 网络工具 windows trace工具 tcp协议

省流 Tracetcp是一个类似于Tracert的工具&#xff0c;使用如下&#xff1a; 1. 安装winpcap &#xff0c; 下载链接&#xff1a;WinPcap Download 2.下载tracetcp软件&#xff0c;下载链接&#xff1a; https://github.com/0xcafed00d/tracetcp/releases 命令&#xff1a;…

期末考试老师怎样发成绩

期末成绩的公布&#xff0c;总是让老师感到焦虑。成绩&#xff0c;这一张张的数字&#xff0c;承载着学生一学期的努力&#xff0c;也牵动着家长们的心。 传统的成绩公布方式&#xff0c;写成绩条让学生带回家&#xff0c;或是通过私发家长的方式&#xff0c;都存在一定的弊端。…

六、Nginx-正向代理和反向代理

目录 一、正向代理 1、参数详解 2、常用变量详解 3、配置示例 二、反向代理 三、 Nginx的安全控制 1、如何使用SSL对流量进行加密 2、nginx添加SSL的支持 3、 Nginx的SSL相关指令 &#xff08;1&#xff09;ssl &#xff08;2&#xff09;ssl_certificate &#xff0…

【Kaggle量化比赛】Top讨论

问: 惊人的单模型得分,请问您使用了多少个特征来获得如此高的得分?我也在使用LGB模型。 答 235个特征(180个基本特征+滚动特征) 问: 您是在使用Polars进行特征工程还是仅依赖于Pandas+Numba/多进程?即使进行了Numba优化,我也发现当滚动特征过多时,推理速度会非常慢。在…

淘宝商品评论API接口测试实例(获取淘宝商品评论,翻页展示、支持并发)

item_review-获得淘宝商品评论 测试页 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop…

设计灵感源泉!7个令人赞叹的网页界面设计展示

网页的界面设计主要是指视觉设计和风格设计。高质量的界面更容易吸引用户的注意力&#xff0c;从而更准确地向用户传达信息。对于设计师来说&#xff0c;他们需要从高质量的作品中获得稳定的灵感&#xff0c;以帮助他们更高效地实现设计目标。在本文中&#xff0c;梳理了7个高质…

人工智能抢走了他们的工作。现在他们得到报酬,让它听起来像人类

人工智能抢走了他们的工作。现在他们得到报酬&#xff0c;让它听起来像人类 如果你担心人工智能会如何影响你的工作&#xff0c;那么广告文案的世界或许能让你窥见未来。 作家本杰明米勒(化名)在2023年初非常红火。他领导了一个由60多名作家和编辑组成的团队&#xff0c;发表博…

一文了解Java 中的String、StringBuffer 与StringBuilder

String结构剖析 String是final 类&#xff0c;不能被其他的类继承 String有属性private final char vaLue[]; 用于存放字符串内容 注意: value 是个final类型&#xff0c; 不可以修改: 即value不能指向新的地址&#xff0c;但是单个字符内容是可以变化 两种创建String对象的区…

24执业药师报名时间汇总及报名流程!

24执业药师报名时间汇总&#xff01;报名流程&#xff01; &#x1f55b;️各省市报名时间汇总&#xff08;共9地&#xff09; 西藏&#xff1a;6月29日-7月8日 新疆&#xff1a;6月25日10:30-7月9日19:00 内蒙古&#xff1a;6月20日9:00-7月3日24:00 新疆兵团&#xff1a;6月2…

RPG游戏完整指南

环境&#xff1a;unity2021urp 本教程教大家如何使用Unity创建一个RPG游戏&#xff0c;玩家可以在城镇场景中进行导航并寻找战斗&#xff0c;并在战斗中遇到不同类型的敌人。玩家可以向敌人施加不同的动作&#xff0c;如&#xff1a;常规攻击和撤离。这会是一个十分有趣的体验。…

git将代码提交到github

第一次代码提交 1.在github新建一个空白仓库 2、当前在文件下 3、git init 5、git add .(当前目录下所有代码全部提交) 6、git commit -n "init" 这次提交的备注信息 7、git branch -M main 8、git remote add origin (address) 9、git push -u origin main 第…

格雷母线在无人天车定位中的应用

随着工业自动化的不断发展&#xff0c;实现无人天车的精准定位与高效运行&#xff0c;一套高精度的位移测量系统显得至关重要。格雷母线高精度位移测量系统&#xff0c;凭借其卓越的定位性能&#xff0c;成为无人天车的理想选择。 格雷母线高精度位移测量系统由武汉市微深节能科…

如何使用视频文案提取帮手将手机上视频里的声音转成文字?

在自媒体短视频日益增加的时候不少自媒体创作者如何将视频转文字的需求日益增加。本次将给大家分享一款针对广大职场青年用户群体的视频转文字工具&#xff0c;旨在为用户提供高效、准确的视频转文字服务。 如何将手机上的视频转成文字呢 视频转文字工具具有转换速度快&#…

轮式机器人Swiss-Mile城市机动性大提升:强化学习引领未来城市物流

喜好儿小斥候消息&#xff0c;苏黎世联邦理工学院的研究团队成功开发了一款革命性的机器人控制系统&#xff0c;该系统采用强化学习技术&#xff0c;使轮式四足机器人在城市环境中的机动性和速度得到了显著提升。 喜好儿网 这款专为轮腿四足动物设计的控制系统&#xff0c;能…

机械臂抓取物体整体的开发流程

开发一个机械臂抓取物体的系统涉及多个步骤和不同领域的知识&#xff0c;包括机械设计、控制系统、传感器集成、软件开发等。以下是一个全面的开发流程概述&#xff1a; 1. 需求分析与系统设计 需求分析&#xff1a; 明确机械臂需要抓取的物体类型&#xff08;大小、重量、材…