重学SpringBoot3-SpringApplicationRunListener

embedded/2024/9/20 2:05:07/ 标签: spring boot, java

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-SpringApplicationRunListener

  • 1. 基本作用
  • 2. 如何实现
    • 2.1. 创建SpringApplicationRunListener
    • 2.2. 注册SpringApplicationRunListener
    • 2.3. 完整示例
  • 3. 适用场景
  • 4. 总结

SpringApplicationRunListener 是 Spring Boot 框架中的一个接口,主要用于监听 Spring Boot 应用启动过程中的不同阶段。通过实现这个接口,开发者可以在应用启动的过程中插入自定义的逻辑,例如在启动前进行某些预处理、修改应用上下文,甚至在启动失败时做出相应的处理。

在 Spring Boot 3 中,SpringApplicationRunListener 保持了其核心功能,并且随着 Spring 框架的进化,提供了一些更灵活的应用配置和启动定制化支持。

1. 基本作用

SpringApplicationRunListener 作为一个监听器接口,提供了多个钩子方法来捕捉应用启动的各个阶段。Spring Boot 应用启动过程中大致包含以下几个步骤:

  1. 准备环境(EnvironmentPrepared):在读取应用程序配置、解析命令行参数后,准备运行环境。
  2. 准备上下文(ContextPrepared):在应用上下文被创建并准备好但尚未刷新时。
  3. 上下文加载完成(ContextLoaded):在应用上下文加载完成但还未启动时。
  4. 上下文启动(Started):应用上下文刷新并启动。
  5. 运行完成(Running/Ready):整个应用完全启动并准备处理请求。
  6. 启动失败(Failed):应用在启动过程中发生错误或异常。

通过实现 SpringApplicationRunListener,可以在这些关键步骤之间插入自定义逻辑,以扩展和控制应用的启动行为。

2. 如何实现

要自定义 SpringApplicationRunListener,需要:

  1. 实现接口:创建一个类实现 SpringApplicationRunListener 接口。
  2. 注册监听器:在 META-INF/spring.factories 文件中注册自定义的监听器类。

2.1. 创建SpringApplicationRunListener

首先,创建一个类并实现 SpringApplicationRunListener 接口。

SpringBoot2.6以上版本

java">package com.coderjia.boot.confi;import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;import java.time.Duration;/*** @author CoderJia* @create 2024/09/13 15:41* @Description**/
public class CustomSpringApplicationRunListener implements SpringApplicationRunListener {public CustomSpringApplicationRunListener(SpringApplication application, String[] args) {// 必须定义这个构造方法,以便 Spring 能正确初始化这个监听器}@Overridepublic void starting(ConfigurableBootstrapContext bootstrapContext) {System.out.println("应用正在启动:starting()");}@Overridepublic void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {System.out.println("环境已经准备好:environmentPrepared()");}@Overridepublic void contextPrepared(ConfigurableApplicationContext context) {System.out.println("上下文已准备:contextPrepared()");}@Overridepublic void contextLoaded(ConfigurableApplicationContext context) {System.out.println("上下文已加载:contextLoaded()");}@Overridepublic void started(ConfigurableApplicationContext context, Duration timeTaken) {System.out.println("应用已启动!启动耗时:" + timeTaken.toMillis() + " 毫秒");}@Overridepublic void ready(ConfigurableApplicationContext context, Duration timeTaken) {System.out.println("应用已准备就绪!启动耗时:" + timeTaken.toMillis() + " 毫秒");}@Overridepublic void failed(ConfigurableApplicationContext context, Throwable exception) {System.out.println("应用启动失败:failed()");}
}

每个方法代表应用启动的一个关键阶段,开发者可以在这些方法中插入自定义逻辑,如日志记录、性能监控或额外的资源加载。

SpringBoot2.6之前版本

SpringBoot2.6以上版本主要是用running 方法被替换为 ready 方法,started 方法现在也接收一个额外的 Duration timeTaken 参数。

为什么替换 runningready

Spring Boot 团队在 2.6.0 版本中做出这一修改的目的是为了更加精确地表示应用启动完成的状态。running 方法的名称虽然也表示应用已经启动,但它并没有表达出应用已经完全准备好处理外部请求的意思。相反,ready 方法名称更明确,表示应用已经达到可用状态。另外,Duration 参数为开发者提供了额外的信息,能够监控启动时间。这对生产环境下的性能调优和监控非常有帮助。

started和ready的区别

在 Spring Boot 的应用生命周期中,started 方法表示应用上下文已经刷新并完全启动,此时 Bean 已经加载完成,ApplicationContext 已经初始化和准备好。和 ready 方法的区别是,started 标志着应用在完成上下文刷新之后,还没有完全准备好处理外部请求,而 ready 是表示应用进入可以处理请求的状态。通过添加 Duration timeTaken 参数,开发者可以记录应用从启动到上下文准备完成的时间,这对于分析应用启动阶段的性能非常有帮助。

2.2. 注册SpringApplicationRunListener

要使 Spring Boot 能够发现并使用自定义的监听器,需要在 META-INF/spring.factories 文件中进行注册。确保该文件位于 resources 目录下,内容如下:

org.springframework.boot.SpringApplicationRunListener=\
com.coderjia.boot.confi.CustomSpringApplicationRunListener

spring.factories配置

这个配置会告诉 Spring Boot 在启动时加载并使用自定义的 SpringApplicationRunListener 实现。

2.3. 完整示例

新建一个 Spring Boot 项目,在项目中,我们希望在启动的每个阶段输出日志,确保启动过程中的每个步骤都清晰可见。以下是一个完整的代码示例:

启动 Spring Boot 应用时,就会在控制台中看到每个启动阶段的日志输出。

演示

3. 适用场景

SpringApplicationRunListener 的使用场景包括但不限于:

  • 启动日志记录:可以精确记录应用的启动过程,便于后续的性能分析和调优。
  • 环境变量配置:在 environmentPrepared 阶段,可以动态调整环境变量的值。
  • 启动故障处理:在 failed 方法中处理启动失败后的逻辑,比如发送通知或日志存储。
  • 条件化启动逻辑:可以根据不同的条件,在启动过程中启用或禁用特定的功能。

4. 总结

SpringApplicationRunListener 提供了一个强大的机制,用于在 Spring Boot 应用启动的多个关键阶段插入自定义逻辑。在 Spring Boot 3 中,这个接口依旧是扩展应用启动流程的有效方式。通过合理使用 SpringApplicationRunListener,开发者可以更加灵活地控制应用的启动行为,并为复杂的启动场景提供解决方案。希望这篇文章能够帮助你更好地理解和使用 SpringApplicationRunListener


http://www.ppmy.cn/embedded/113989.html

相关文章

财谷通抖音小店的独特魅力

在当今这个数字化飞速发展的时代,电子商务已成为推动经济增长的重要引擎之一,而短视频平台的崛起,更是为这一领域注入了新的活力。抖音,作为短视频领域的佼佼者,不仅是一个娱乐消遣的平台,更是一个潜力巨大…

Qwen 2.5:阿里巴巴集团的新一代大型语言模型

Qwen 2.5:阿里巴巴集团的新一代大型语言模型 摘要: 在人工智能领域,大型语言模型(LLMs)的发展日新月异,它们在自然语言处理(NLP)和多模态任务中扮演着越来越重要的角色。阿里巴巴集…

对抗性EM用于变分深度学习:在低剂量PET和低剂量CT中的半监督图像质量增强应用|文献速递--Transformer架构在医学影像分析中的应用

Title 题目 Adversarial EM for variational deep learning: Application to semi-supervised image quality enhancement in low-dose PET and low-dose CT 对抗性EM用于变分深度学习:在低剂量PET和低剂量CT中的半监督图像质量增强应用 01 文献速递介绍 医学影…

微服务网关终极进化:设计模式驱动的性能与可用性优化(四)

时间:2024年09月12日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 希望大家帮个忙!如果大家有工作机会,希望帮小蒋推荐一下,小蒋希望遇到一个认真做事的团队,一起努力…

WPF中的控件转换(Transform)

不可不知的WPF转换(Transform) 在WPF开发中,经常会需要用到UI控件的2D转换(如:旋转,缩放,移动,倾斜等功能),本文以一些简单的小例子,简述如何通过Transform类实现FrameworkElement对象的2D转换,仅供学习分享使用,如有不足之处,还请指正。 什么是Transform? 转…

Python编码系列—Python建造者模式:构建复杂对象的优雅之道

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

模版进阶(template)

1.非类型模版参数 模版参数分类类型形参与非类型形参。 ① 类型形参:出现在在模板参数列表中,跟在class或者typename之类的参数类型名称。 ② 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当…

记一次实战中对fastjson waf的绕过

最近遇到一个fastjson的站,很明显是有fastjson漏洞的,因为type这种字符,fastjson特征很明显的字符都被过滤了 于是开始了绕过之旅,顺便来学习一下如何waf 编码绕过 去网上搜索还是有绕过waf的文章,下面来分析一手&a…

openGemini 社区人才培养计划:助力成长,培养新一代云原生数据库人才

一、摘要 在技术革新的浪潮中,数据库技术是现代信息技术的基石,openGemini社区携手开发者,启动人才培养计划,旨在培养新一代云原生数据库技术人才,共同推动云原生数据库技术创新。 二、社区介绍 openGemini是一款开…

获取java jdk包的方式记录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、OpenLogic方式二、华为源下载 前言 记录一下获取java jdk的方式方法。 一、OpenLogic方式 网址:https://www.openlogic.com/openjdk-download…

Vue常见面试题目

computed与watch区别 computed(计算属性)watch(侦听器)定义与用途计算属性(computed)用于声明式地描述一些依赖响应式属性的计算值。当依赖的响应式属性值发生变化时,计算属性会重新求值。侦听…

动态IP池的IP都是纯净IP吗?

在当今互联网时代,动态IP池作为一种网络资源管理策略,被广泛应用于数据抓取、市场调研、广告验证等多种场景中。动态IP池能够提供大量可轮换的IP地址,以帮助用户避免因频繁访问同一网站而被封禁IP的情况。然而,一个关键的问题是&a…

机器学习2--matplotlib绘图包

文章目录 一、折线图二、基础绘图功能三、一个坐标系绘制多张图像四、多个坐标系显示 一、折线图 import matplotlib.pyplot as plt # 创建画布 plt.figure(figsize(10,10), dpi100) #指定长宽、清晰度 #绘制图像 plt.plot([1,2,4,7,1,3,4,6,2]) #显示图片 plt.show()二、基础…

Nacos和Eureka的区别

前言 Nacos 和 Eureka 都是用于服务发现与注册的工具,它们在微服务架构中都扮演着重要角色。 Nacos与Eureka的共同点 都支持服务注册和服务拉取都支持服务提供者心跳方式做健康检测 Nacos与Eureka的区别 Nacos支持服务端主动检测提供者状态:临时实例采…

关雅荻发文批评某脱口秀节目审核问题:为博流量乱搞事情?

最近,针对某脱口秀节目中引发的网络舆情,电影制片人关雅荻发文严厉批评该视频平台的审核问题,指出“这家视频网站对应的节目审核环节严重失职,或者有意渎职,这个脱口秀节目制作方在自己内容策划和制作也有明显失职、严…

我的AI工具箱Tauri版-MicrosoftTTS文本转语音

本教程基于自研的AI工具箱Tauri版进行MicrosoftTTS文本转语音服务。 MicrosoftTTS文本转语音服务 是自研的AI工具箱Tauri版中的一款功能模块,专为实现高效的文本转语音操作而设计。通过集成微软TTS服务,用户可以将大量文本自动转换为自然流畅的语音文件…

PyTorch----模型运维与实战

一、PyTorch是什么 PyTorch 由Facebook开源的神经网络框架,专门针对 GPU 加速的深度神经网络(DNN)编程。 二、PyTorch安装 首先确保你已经安装了GPU环境,即Anaconda、CUDA和CUDNN 随后进入Pytorch官网​​​​​​PyTorch 官…

Python学习——【2.1】if语句相关语法

文章目录 【2.1】if语句相关一、布尔类型和比较运算符(一)布尔类型(二)比较运算符 二、if语句的基本格式※、练习 三、if-else组合判断语句※、练习 四、if-elif-else多条件判断语句※、练习 五、判断语句的嵌套※、实战案例 【2.…

uniapp组件uni-datetime-picker选择年月后在ios上日期不显示

uniapp组件uni-datetime-picker选择年月后在ios上日期不显示 操作步骤: ios 选择年月 预期结果: 日期变为选择年月的日期 实际结果: 日期不显示 bug描述: uni-datetime-picker 2.2.22 ios点击年月选择后日期不显示 解决方案 …

静电保护对UWB模块的必要性

在现代无线通信领域,UWB技术因其高精度定位和高速数据传输能力受到广泛关注。UWB技术的应用场景涵盖了从物联网到工业自动化的多个领域。然而,即便是最先进的UWB模块,也可能面临环境中静电放电(ESD)的威胁。 什么是ESD…