【SpringBoot3】应用程序启动监听

一、监听应用启动的常见场景

应用启动监听在 Spring Boot 和其他框架中扮演着重要的角色。它们的主要作用是在应用启动或关闭时触发特定的操作或任务。

以下是一些常见的应用启动监听场景:

  1. 初始化操作:在应用启动时,你可能需要执行一些特定的初始化操作,例如加载配置文件、建立数据库连接池等。通过实现 ApplicationListener 接口或使用 @EventListener 注解,你可以在这些关键时刻添加自定义逻辑,确保你的应用程序能够正确地启动并运行。
  2. 数据预处理:在应用启动时,你可能需要进行数据预处理,例如清理上一次运行遗留的垃圾数据或者将常用的数据加载到内存中。通过实现 CommandLineRunnerApplicationRunner 接口,你可以在应用启动后执行这些任务。
  3. 系统通知:当应用成功启动时,你可以发送一个系统通知,例如通过邮件或消息队列通知其他系统或管理员。这可以帮助你与其他系统集成,提供统一的监控和管理界面。
  4. 健康检查和监控:通过定义健康检查端点、指标收集等功能,你可以对应用进行健康检查和监控。这些功能通常由 Spring Boot Actuator 提供支持。通过监听相应的事件,你可以在应用启动时启用或禁用这些功能。
  5. 依赖服务检查:在应用启动阶段,可以检查依赖服务(如数据库、消息队列、缓存等)是否可用,并在不可用时采取适当的措施,如延迟启动或记录错误。这有助于确保你的应用程序能够在稳定的环境下正常运行。
  6. 动态配置更新:在一些情况下,你需要根据环境变量或其他条件来动态更新应用的配置。通过监听配置文件的修改事件,你可以在应用启动时重新加载配置,以适应不同的环境或配置变化。
  7. 日志记录:在应用启动过程中,你可能希望记录一些关键信息,例如启动时间、版本号、运行环境等。这将有助于问题排查和审计工作。
  8. 安全性检查:在某些情况下,你可能需要在应用启动阶段执行安全性相关的检查,例如验证加密密钥、检查安全漏洞等。通过监听相应的事件,你可以执行这些检查以确保应用的安全性。

二、监听应用启动的方法

在 Spring Boot 中,你可以通过实现 ApplicationListener 接口、使用 @EventListener 注解或实现 CommandLineRunner / ApplicationRunner 接口来创建自定义的启动监听器。这些监听器使得你能够在应用生命周期的关键时刻执行自定义逻辑,从而增强应用的可用性、可维护性和健壮性。

在 Spring Boot 应用中,你可以通过实现特定的接口或使用注解来监听应用的启动和关闭事件。以下是一些常见的方法:

1)实现 ApplicationListener 接口

你可以创建一个类来实现 ApplicationListener 接口,并指定要监听的事件类型。例如,要监听应用启动完成事件,你可以这样做:

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Component
public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent> {@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {// 处理应用启动完成事件}
}

2)使用 @EventListener 注解

在 Spring 4.2 及以上版本中,你可以使用 @EventListener 注解来监听事件,而无需实现 ApplicationListener 接口。例如:

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class MyEventListener {@EventListener(ApplicationReadyEvent.class)public void onApplicationReadyEvent(ApplicationReadyEvent event) {// 处理应用启动完成事件}
}

3)使用 ApplicationRunnerCommandLineRunner 接口

虽然这不是严格意义上的监听器,但 ApplicationRunnerCommandLineRunner 接口提供了一种在应用启动后执行代码的方法。这两个接口非常相似,唯一的区别是 CommandLineRunnerrun 方法接收一个字符串数组作为参数,而 ApplicationRunnerrun 方法接收一个 ApplicationArguments 对象。

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;@Component
public class MyApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {// 应用启动后执行代码}
}

4)Spring Boot Actuator 的健康检查和指标

虽然不是监听器,但如果你想要在应用运行时监控其状态,你可以使用 Spring Boot Actuator。它提供了健康检查、指标收集等功能。

5)Spring Framework 的事件监听

除了 Spring Boot 提供的事件外,你还可以监听 Spring Framework 定义的事件,例如 ContextRefreshedEvent(当 ApplicationContext 被初始化或刷新时触发)。

记住,当你创建监听器时,确保它们被 Spring 容器管理(例如,通过 @Component 注解将它们声明为 bean),这样它们才能正确接收到事件通知。

三、SpringBoot不同阶段的事件

Spring Boot应用启动过程中的不同阶段分表对应不同的事件:

1)ApplicationStartingEvent

  • 这个事件在应用启动开始时触发,非常早期,甚至在任何 Spring 容器刷新之前。
  • 它通常用于执行非常早期的初始化代码,或者监听系统属性、环境变量等。

2)ApplicationEnvironmentPreparedEvent

  • 当 Spring Boot 的 Environment 准备好并且已经应用了任何可用的 PropertySource,但在 ApplicationContext 创建之前触发。
  • 你可以使用这个事件来修改或添加属性源。

3)ApplicationPreparedEvent

  • 在 Spring 上下文被刷新之前,但在 bean definitions 被加载之后触发。
  • 此时,你可以访问应用上下文,但是 beans 还没有被创建。

4)ApplicationStartedEvent

  • 在 Spring 上下文刷新之后触发,意味着所有的 bean 已经被创建,但还没有调用任何 CommandLineRunnerApplicationRunner
  • 此时,应用已经启动,但可能还没有准备好处理请求。

5)ApplicationReadyEvent

  • 当应用已经启动并且准备好了处理请求时触发。
  • 这通常意味着所有的 CommandLineRunnerApplicationRunner 都已经被调用,并且应用已经完成了其启动过程。

6)ApplicationFailedEvent

  • 如果应用启动失败,则会触发此事件。
  • 这允许你执行一些清理工作,或者记录关于失败的信息。

通过监听这些事件,你可以在应用启动和关闭的不同阶段执行自定义逻辑,从而实现更精细的控制和扩展性。例如,你可能希望在 ApplicationReadyEvent 触发后发送一个通知,表明应用已成功启动并准备好接收请求。或者,在 ApplicationFailedEvent 触发时,你可能想要记录详细的错误日志,并通知管理员。

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

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

相关文章

多多关键字API php java Python

多多关键字API接口广泛应用于商家进行市场分析、竞品分析、关键词优化等场景。商家可以通过分析关键词数据&#xff0c;了解用户需求&#xff0c;制定针对性的营销策略&#xff0c;提高产品的曝光率和转化率。 多多-item_seach-通过关键字搜索商品列表 公共参数 获取key和秘钥…

分布式和集群的区别?

分布式系统和集群是两种常见的计算机系统架构&#xff0c;它们在设计和功能上有一些区别。 分布式系统&#xff1a; 定义&#xff1a;分布式系统是由多台计算机组成的网络&#xff0c;这些计算机通过网络进行通信和协作&#xff0c;共同完成一个或多个共同目标的系统。这些计算…

rtt的io设备框架面向对象学习-电阻屏LCD设备

目录 1.8080通信的电阻屏LCD设备1.1 构造流程1.2 使用2.i2c和spi通信的电阻屏LCD 电阻屏LCD通信接口有支持I2c、SPI和8080通信接口的。 1.8080通信的电阻屏LCD设备 rtt没有实现的设备驱动框架层&#xff0c;那么是在驱动层直接实现的&#xff0c;以stm32f407-atk-explorer为例…

TCP的Keep-Alive检测机制 和 Nagle算法

TCP的Keep-Alive检测机制&#xff1a; TCP的Keep-Alive是一种用于检测连接是否仍然有效的机制。它通过在一段时间内没有数据传输时发送特殊的Keep-Alive探测报文&#xff0c;来判断连接是否仍然存活。这个机制通常在以下情况下使用&#xff1a; 长时间的空闲连接&#xff1a; …

centos7安装kafka、zookeeper

安装jdk 安装jdk8 安装zookeeper 在指定目录执行下载命令 我是在/newdisk/zookeeper目录下 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz --no-check-certificate下载好后并解压 tar -zxvf apache-zookeeper-3.5…

前端添加压缩包内文件名称校验

1. tar包内文件名称校验 1. 读取tar包内所有的文件名称 export class TarReader {fileInfo: any[]buffer: string | ArrayBufferconstructor() {this.fileInfo []}readFile(file) {return new Promise(resolve > {const reader new FileReader()reader.onload event &g…

Kruskal算法

Kruskal算法&#xff1a;是求连通网的最小生成树的另一种方法。与Prim算法不同&#xff0c;它的时间复杂度为O&#xff08;eloge&#xff09;&#xff08;e为图中的边数&#xff09;&#xff0c;所以&#xff0c;适合于求边稀疏的网的最小生成树 时间复杂度&#xff1a;主要由…

Debezium发布历史165

原文地址&#xff1a; https://debezium.io/blog/2023/10/05/Debezium-JMX-signaling-and-notifications/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium signaling and notifications - Part 3: JMX …

【Maven】Maven 基础教程(四):搭建 Maven 私服 Nexus

《Maven 基础教程》系列&#xff0c;包含以下 4 篇文章&#xff1a; Maven 基础教程&#xff08;一&#xff09;&#xff1a;基础介绍、开发环境配置Maven 基础教程&#xff08;二&#xff09;&#xff1a;Maven 的使用Maven 基础教程&#xff08;三&#xff09;&#xff1a;b…

我的NPI项目之Android 安全系列 -- Keymaster到底是个什么

最近因为一直在调研独立secure element集成的工作&#xff0c;不巧的是目前使用的高通平台只有NFC-eSE的方案。高通目前也并不支持独立的eSE集成&#xff0c;codebase中并无相对应的代码。举个例子&#xff0c;目前使用的STM的一款eSE&#xff0c;但是这款eSE的开发STM还没有完…

HarmonyOS—HAP唯一性校验逻辑

HAP是应用安装的基本单位&#xff0c;在DevEco Studio工程目录中&#xff0c;一个HAP对应一个Module。应用打包时&#xff0c;每个Module生成一个.hap文件。 应用如果包含多个Module&#xff0c;在应用市场上架时&#xff0c;会将多个.hap文件打包成一个.app文件&#xff08;称…

matlab 提取分割位于多边形区域边缘内部或边缘上的点

[in,on] = inpolygon(xq,yq,xv,yv) xv 和 yv 为定义的多边形区域的,如xv = [1 4 4 1 1 ];yv = [1 1 4 4 1 ];注意最后一个数字与第一个重复,保证多边形闭合; xq 和 yq 为待查询的点in:在多边形内部和边缘的点序号on:仅在多边形边缘的点序号 提取分割方法: matrix=[xq yq…

ios端接口代码语言-身份证号实名认证ios端接口

身份证核验&#xff0c;其背后必须要有权威&#xff0c;真实的身份证信息数据库作为基础&#xff0c;如中安未来翔云OCR云平台&#xff08;www.netocr.com&#xff09;近期上线的身份证核验功能&#xff0c;就是与权威机构合作&#xff0c;拥有权威&#xff0c;真实的身份证信息…

大数据技术学习笔记(五)—— MapReduce(1)

目录 1 MapReduce 概述1.1 MapReduce 定义1.2 MapReduce 优缺点1.3 MapReduce 核心思想1.4 MapReduce 进程1.5 Hadoop 序列化类型1.6 MapReduce 编程规范1.7 WordCount 案例实操1.7.1 案例需求1.7.2 环境准备1.7.3 编写程序1.7.4 测试 2 MapReduce 序列化2.1 序列化概述2.2 自定…

JavaScript中数组相关

JavaScript中有很多用于操作数组的内置函数。以下是一些常用的数组函数&#xff1a; 1. Array.prototype.push(): 向数组末尾添加一个或多个元素&#xff0c;并返回新数组的长度。 2. Array.prototype.pop(): 删除并返回数组的最后一个元素。 3. Array.prototype.unshift(): 向…

浅析volatile关键字

浅析volatile关键字 文章目录 浅析volatile关键字1. volatile关键字的意义2.volatile应用3. volatile常见问题总结 1. volatile关键字的意义 ​ 被 volatile 修饰的变量&#xff0c;在对其进行读写操作时&#xff0c;会引发一些可观测的副作用。而这些可观测的副作用&#xff…

sql单表运用11.3

一、进入数据库操作界面 1、mysql -u root -p 敲回车 &#xff0c;输入密码 &#xff0c;进入数据库操作界面 2、show databases 查看所有的数据&#xff08;如果没有数据库&#xff1a;创建数据库 create database 库名称&#xff09; 3、use 数据库名 使…

探索Terraform实践:优化基础设施管理

Terraform 是管理基础设施及代码&#xff08;IaC&#xff09;最常用的工具之一&#xff0c;它能使我们安全且可预测地对基础设施应用更改。 Terraform作为一个强大的基础设施即代码工具&#xff0c;为开发人员和运维团队提供了一种简单而强大的方式来定义、部署和管理基础设施。…

软件工程顶会——ICSE '24 论文清单、摘要

1、A Comprehensive Study of Learning-based Android Malware Detectors under Challenging Environments 近年来&#xff0c;学习型Android恶意软件检测器不断增多。这些检测器可以分为三种类型&#xff1a;基于字符串、基于图像和基于图形。它们大多在理想情况下取得了良好的…

Go-gin-example 第四部分 重启服务

文章目录 知识点本节目标何谓优雅 ctrlc信号 修改流程实现优雅重启endless安装 编写验证编译执行唤醒问题 续接 上一节 知识点 信号量的了解应用热更新 本节目标 在前文中&#xff0c;我们在配置玩之后直接使用 ctrlc 来进行进程的结束&#xff0c;我们将了解 ctrlc 的过程…