重学SpringBoot3-SpringApplicationRunListener

news2024/11/24 14:37:48

更多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以上版本

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 能正确初始化这个监听器
    }

    @Override
    public void starting(ConfigurableBootstrapContext bootstrapContext) {
        System.out.println("应用正在启动:starting()");
    }

    @Override
    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
        System.out.println("环境已经准备好:environmentPrepared()");
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("上下文已准备:contextPrepared()");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("上下文已加载:contextLoaded()");
    }

    @Override
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("应用已启动!启动耗时:" + timeTaken.toMillis() + " 毫秒");
    }

    @Override
    public void ready(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("应用已准备就绪!启动耗时:" + timeTaken.toMillis() + " 毫秒");
    }

    @Override
    public 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.coloradmin.cn/o/2135388.html

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

相关文章

fpga系列 HDL:利用泰勒级数实现指数函数模块exponent

模块实现了指数函数的计算,利用泰勒级数展开进行近似计算。 e x 1 x 1 ! x 2 2 ! x 3 3 ! x 4 4 ! ⋯ e^x 1 \frac{x}{1!} \frac{x^2}{2!} \frac{x^3}{3!} \frac{x^4}{4!} \cdots ex11!x​2!x2​3!x3​4!x4​⋯ 它依赖于 floatMult 和 floatAdd 两个子…

解决 PyCharm 无法启动 Jupyter 服务器的问题:报错分析与解决方案

文章目录 报错背景报错详细信息解决方案pycharm 设置 报错背景 在使用 pycharm 付费版的过程中,发现一直无法启动 jupyter 服务器。 一直也不知道是为什么,直到在终端输入: jupyter notebook发现 jupyter 服务无法启动。 报错详细信息 下…

uniapp网络延迟优化之骨架屏

文章目录 前言uniapp网络延迟优化之骨架屏 一、骨架屏是什么?二、使用步骤1.在微信开发者工具生成骨架屏文件2.转成vue组件3.组件中使用4.效果展示4.开发时遇到的问题? 总结 前言 uniapp网络延迟优化之骨架屏 一、骨架屏是什么? 骨架屏的主…

在SOME/IP协议中Service Entry和Eventgroup Entry有什么作用?

在SOME/IP协议中,Service Entry和Eventgroup Entry是用于服务发现和事件订阅的关键元素。 1、Service Entry Service Entry主要用于服务发现,包括以下几种类型: Find Service:客户端发送请求以查找特定的服务。Offer Service:服务端广播其提供的服务,通知客户端该服务可…

基于Java的建筑节能监测系统+公共建筑能耗监测系统

建筑节能监测系统公共建筑能耗监测系统建筑能耗监测系统节能监测系统能耗监测建筑能耗监测能耗分析能耗管理能耗预测能耗监控能耗监测平台建筑能耗 介绍 能耗监控系统是为耗电量、耗水量、耗气量(天然气量或者煤气量)、集中供热耗热量、集中供冷耗冷量…

基于GA-PSO-BP混合神经网络的多输入多输出数据预测-Python代码实现

在机器学习中,多输入多输出(MIMO)问题常见于复杂系统建模、控制和预测。本文将介绍一种基于 GA-PSO-BP 混合算法的 MIMO 数据预测方法。我们结合遗传算法(GA)和粒子群优化算法(PSO)对 BP 神经网…

【Linux】多路转接select

一、select介绍 1.1 初始select 系统提供的select函数来实现多路复用输入/输出模型。 select系统调用是用来让我们的程序监视多个文件描述符的状态变化的程序会停止在select这里等待,直到被监视的文件描述符有一个或者多个发生了状态改变 IO 等 拷贝&#xff0…

JavaDS —— LRUCache

概念 LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。…

SpringBoot实现房产销售系统全解析

第二章关键技术的研究 2.1相关技术 房产销售系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言,易于学习,实用且面向用户。全球超过35%的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统,因为它的…

灌区信息化发展趋势展望

灌区信息化作为现代农业发展的重要组成部分,正逐渐成为提升水资源管理效率、保障粮食安全与促进农业可持续发展的关键途径。随着信息技术的飞速进步和智能化技术的广泛应用,灌区信息化的未来发展趋势展现出多维度、深层次的变革与创新,其发展…

C语言 13 指针

指针可以说是整个 C 语言中最难以理解的部分了。 什么是指针 还记得在前面谈到的通过函数交换两个变量的值吗&#xff1f; #include <stdio.h>void swap(int, int);int main() {int a 10, b 20;swap(a, b);printf("a %d, b %d", a, b); }void swap(int …

SSH 弱密钥交换算法 通过禁用CBC模式解决SSH服务器CBC加密模式漏洞(CVE-2008-5161)

自查方法 查看当前支持的加密算法 man sshd_config |grep -A 40 -w KexAlgorithms 修复方法 Linux平台 修改sshd_config配置文件&#xff0c;删除不安全的加密算法 重启服务 systemctl restart sshd 3.查看修改后的配置文件 sshd -T | grep -w kexalgorithms SSH 弱密…

【Python基础】Python迭代器与生成器(两种强大工具)

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、迭代器2.1 创建迭代器2.2 自定义迭代器2.3 处理大型文件 三、生成器四、生成器表达式五、实际应用…

【数据结构初阶】队列接口实现及用队列实现栈超详解

文章目录 1. 概念1. 1 队列底层结构选型1. 2 队列定义 2. 接口实现2. 1 初始化2. 2 判空2. 3 入队列2. 4 出队列2. 5 队尾元素和队头元素和队列元素个数2. 6 销毁2. 7 接口的意义 3. 经典OJ题3. 1 用队列实现栈3. 1. 1 栈的定义3. 1. 2 栈的初始化3. 1. 3 入栈3. 1. 4 出栈3. 1…

计算机视觉(二)—— MDPI特刊推荐

特刊征稿 01 期刊名称&#xff1a; Applied Computer Vision and Pattern Recognition: 2nd Volume 截止时间&#xff1a; 摘要提交截止日期&#xff1a;2024年10月30日 投稿截止日期&#xff1a;2024年12月30日 目标及范围&#xff1a; 包括但不限于以下领域&#xff1a…

C++:线程库

C&#xff1a;线程库 threadthreadthis_threadchrono 引用拷贝问题 mutexmutextimed_mutexrecursive_mutexlock_guardunique_lock atomicatomicCAS condition_variablecondition_variable thread 操作线程需要头文件<thread>&#xff0c;头文件包含线程相关操作&#xf…

上班炒股会被开除吗?公司是如何发现员工上班炒股?一文告诉你答案!

随着互联网金融的发展&#xff0c;股票交易变得越来越便捷&#xff0c;不少上班族选择利用工作之余的时间来进行股票投资。 然而&#xff0c;这种行为是否合规&#xff1f;公司又是如何发现并处理这种情况的呢&#xff1f;本文将为您解答这些问题。 一、上班炒股是否合规&…

JAVA毕业设计175—基于Java+Springboot+vue3的医院预约挂号管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的医院预约挂号管理系统(源代码数据库)175 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、医生、管理员三种角色 1、用户&#x…

交换机最常用的网络变压器分为DIP和SM

华强盛电子导读&#xff1a;交换机通用网络变压器插件48PIN最为常见 您好&#xff01;今天我要给您介绍一款真正能为您的工业生产带来变革的产品——华强盛工业滤波器。在如今这个高度数字化的工业时代&#xff0c;可靠的网络连接至关重要&#xff0c;而华强盛工业网络变压器就…

Smartbi体验中心新增系列Demo,用户体验更丰富

为进一步提升用户体验&#xff0c;让大家更直观地了解Smartbi产品在数据分析方面的功能优势&#xff0c;Smartbi体验中心近期新增了一系列Demo。这些更新旨在优化产品操作流程&#xff0c;并为用户提供更多真实场景下的应用参考。接下来&#xff0c;我们一起简要浏览此次体验中…