如何使用SpringApplicationRunListener在Spring Boot 应用的不同生命周期阶段插入自定义逻辑

目录

    • 一、引言
    • 二、核心方法概述
    • 三、加载机制
    • 四、使用场景
    • 五、扩展 - 如何在测试的不同阶段插入逻辑
      • 5.1 TestExecutionListener & AbstractTestExecutionListener
        • 5.1.1 主要功能
        • 5.1.2 生命周期方法
      • 5.2 如何集成TestExecutionListener
      • 5.3 总结

一、引言

SpringApplicationRunListener 是 Spring Boot 提供的一个接口,用于监听 SpringApplication 的运行过程。它允许开发者在 Spring Boot 应用的不同生命周期阶段插入自定义逻辑。该接口的实现类通过 SpringFactoriesLoader 加载,并且需要提供一个公共构造函数,接受 SpringApplication 实例和 String[] 参数。

二、核心方法概述

  1. starting 方法
    starting(ConfigurableBootstrapContext bootstrapContext) 方法在 run 方法刚开始时立即调用,用于非常早期的初始化操作。

    default void starting(ConfigurableBootstrapContext bootstrapContext) {
    }
    
  2. environmentPrepared 方法
    在环境准备好但 ApplicationContext 尚未创建之前调用。此方法可以用于在环境配置完成后执行逻辑。

    default void environmentPrepared(ConfigurableBootstrapContext bootstrapContext,ConfigurableEnvironment environment) {
    }
    
  3. contextPrepared 方法
    ApplicationContext 创建并准备好,但尚未加载资源之前调用。

    default void contextPrepared(ConfigurableApplicationContext context) {
    }
    
  4. contextLoaded 方法
    ApplicationContext 加载完成但尚未刷新之前调用。

    default void contextLoaded(ConfigurableApplicationContext context) {
    }
    
  5. started 方法
    在上下文刷新后,应用启动完成,但 CommandLineRunnerApplicationRunner 尚未执���时调用。

    default void started(ConfigurableApplicationContext context, Duration timeTaken) {
    }
    
  6. ready 方法
    run 方法即将结束时调用,此时应用上下文已刷新,所有 CommandLineRunnerApplicationRunner 已执行。

    default void ready(ConfigurableApplicationContext context, Duration timeTaken) {
    }
    
  7. failed 方法
    如果应用启动过程中发生异常,则调用此方法。

    default void failed(ConfigurableApplicationContext context, Throwable exception) {
    }
    

三、加载机制

SpringApplicationRunListener 的实现类通过 SpringFactoriesLoader 加载,开发者需要在 META-INF/spring.factories (适用于SpringBoot2)或 META-INF/spring/org.springframework.boot.SpringApplicationRunListener(适用于SpringBoot3) 文件中注册实现类。

META-INF/spring.factories 示例:

org.springframework.boot.SpringApplicationRunListener=\
com.luo.MySpringApplicationRunListener

META-INF/spring/org.springframework.boot.SpringApplicationRunListener示例:

com.luo.MySpringApplicationRunListener

四、使用场景

该接口适用于需要在 Spring Boot 启动的不同阶段插入自定义逻辑的场景,例如日志记录、环境配置或启动监控等。

我的使用场景是在SpringBoot启动前执行一些扩展逻辑,所以只是重写了SpringApplicationRunListener.starting方法,但是在starting方法通过org.slf4j.Logger打印的日志没有正常显示(由于starting阶段日志框架没有加载完成),所以又单独做了个日志打印工具,在starting阶段调用日志工具时将日志内容缓存起来,之后在contextPrepared方法中统一对缓存的日志进行打印,当然你也可以直接System.out.println进行打印…

五、扩展 - 如何在测试的不同阶段插入逻辑

5.1 TestExecutionListener & AbstractTestExecutionListener

AbstractTestExecutionListener 是 Spring 框架中一个抽象类,位于 org.springframework.test.context.support 包下。它实现了 TestExecutionListenerOrdered 接口,主要用于在测试执行过程中提供扩展点。以下是对该类的详细说明:

5.1.1 主要功能
  1. 实现 Ordered 接口

    • 提供了 getOrder() 方法,默认返回 Ordered.LOWEST_PRECEDENCE,表示该监听器的执行顺序优先级最低。
    • 子类可以重写此方法以调整执行顺序。
  2. 实现 TestExecutionListener 接口

    • 提供了多个生命周期方法(如 beforeTestClassafterTestMethod 等),这些方法在测试执行的不同阶段被调用。
    • 默认实现是空操作(no-op),子类可以根据需要重写这些方法以添加自定义逻辑。
5.1.2 生命周期方法

以下是 TestExecutionListener 接口中定义的生命周期方法及其默认实现:

  • beforeTestClass:在测试类执行前调用,默认无操作。
  • prepareTestInstance:在测试实例准备好后调用,默认无操作。
  • beforeTestMethod:在每个测试方法执行前调用,默认无操作。
  • beforeTestExecution:在测试方法执行前调用(从 Spring 5.2 开始),默认无操作。
  • afterTestExecution:在测试方法执行后调用(从 Spring 5.2 开始),默认无操作。
  • afterTestMethod:在每个测试方法执行后调用,默认无操作。
  • afterTestClass:在测试类执行后调用,默认无操作。

5.2 如何集成TestExecutionListener

通过@TestExecutionListeners.listeners引用自定义的TestExecutionListener实现类:

@SpringBootTest
@TestExecutionListeners(listeners = MyTestExecutionListener.class, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS
)
public class MyTest {@Testvoid testBiz() {}
}

5.3 总结

AbstractTestExecutionListener 是一个便于扩展的抽象类,提供了测试执行生命周期的钩子方法,默认实现为空操作,子类可以根据需要重写这些方法以实现自定义逻辑,同时支持通过 Ordered 接口控制执行顺序。继承该类可在测试执行的不同阶段插入自定义逻辑,例如初始化资源、清理资源、记录日志等

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

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

相关文章

【NLP】 19. Tokenlisation 分词 BPE, WordPiece, Unigram/SentencePiece

1. 翻译系统性能评价方法 在机器翻译系统性能评估中,通常既有人工评价也有自动评价方法: 1.1 人工评价 人工评价主要关注以下几点: 流利度(Fluency): 判断翻译结果是否符合目标语言的语法和习惯。充分性…

openai发布今天发布了o3和o4-mini。

ChatGPT Plus、Pro和Team用户已经可以使用o3、o4-mini和o4-mini-high,取代o1、o3-mini和o3-mini-high。具体特点: ChatGPT-o3 特点:o3模型使用高级推理技术,这意味着它在处理复杂问题和逻辑推理方面表现出色。但是不能联网搜索 …

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之触摸屏 Touch)

目录 ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之触摸屏 Touch)简介模块概述功能定义架构位置核心特性 触摸(Touch)外设触摸外设概述触摸外设API和数据结构外设层API(periph_touch.h/periph_touch…

python 读取分级目录

import osdef read_files_in_directory(root_dir):# 遍历根目录下的所有文件和目录for year_dir in os.listdir(root_dir):year_path os.path.join(root_dir, year_dir)if os.path.isdir(year_path): # 确保是目录for month_dir in os.listdir(year_path):# if month_dir in …

MongoServerError: Authentication failed.处理办法

1停止MongoDB服务: systemctl stop mongod2临时修改MongoDB配置,禁用认证: vim /etc/mongdb.config 在配置文件中找到 security:authorization: disabled # 临时关闭认证3.重启MongoDB服务 # 重启MongoDB服务 sudo systemctl restart mon…

ObjectInputStream 终极解析与记忆指南

ObjectInputStream 终极解析与记忆指南 一、核心本质 ObjectInputStream 是 Java 提供的对象反序列化流,继承自 InputStream,用于读取由ObjectOutputStream序列化的Java对象。 核心特性速查表 特性说明继承链InputStream → ObjectInputStream核心功能实现Java对象反序列化…

Java面试高频问题(1-5)

一、HashMap实现原理与并发问题 核心机制 1. 哈希冲突解决方案:采用数组链表红黑树结构(JDK1.8),当链表长度超过阈值(默认8)时转为红黑树,提升查询效率 2. 扩容机制:当元素数量超过…

Genspark:重新定义AI搜索与代理的全能型工具

在当今快速发展的AI技术领域,搜索工具正在经历前所未有的变革。Genspark,这家由前百度高管景鲲和朱凯华创立的AI公司,为我们带来了全新的AI代理引擎体验。作为一位专注于AI工具分享的博主,今天我将为大家详细介绍这款强大的工具&a…

工作记录3

前言: 继续刷尚硅谷的前端视频,查漏补缺。 JS (1)apply() 方法与 call() 方法 (2)构造函数 (3)原型对象<

photo-sphere-viewer 4.8.1在vue中使用

photo-sphere-viewer 加载单张平面图 import { Viewer } from photo-sphere-viewerthis.viewer new Viewer({panorama: ‘完整的url,也可以是一个base64’,// Containercontainer: document.getElementById(viewer1),navbar: true,// Resize the panoramasize: {width: 100%,…

【PyTorch】PyTorch中的非线性激活函数详解:原理、优缺点与实战指南

目录 PyTorch中的非线性激活函数详解&#xff1a;原理、优缺点与实战指南一、核心激活函数作用、分类与数学表达1. 传统饱和型激活函数2. ReLU族&#xff08;加权和类核心&#xff09;3. 自适应改进型激活函数4. 轻量化与硬件友好型 二、优缺点对比与适用场景三、选择策略与PyT…

中间件--ClickHouse-7--冷热数据分离,解决Mysql海量数据瓶颈

在web应用中&#xff0c;当数据量非常大时&#xff0c;即使MySQL的存储能够满足&#xff0c;但性能一般也会比较差。此时&#xff0c;可以考虑使用ClickHouse存储历史数据&#xff0c;在Mysql存储最近热点数据的方式&#xff0c;来优化和提升查询性能。ClickHouse的设计初衷就是…

阿里一面:Nacos配置中心交互模型是 push 还是 pull ?(原理+源码分析)

对于Nacos大家应该都不太陌生&#xff0c;出身阿里名声在外&#xff0c;能做动态服务发现、配置管理&#xff0c;非常好用的一个工具。然而这样的技术用的人越多面试被问的概率也就越大&#xff0c;如果只停留在使用层面&#xff0c;那面试可能要吃大亏。 比如我们今天要讨论的…

DAY09:【pytorch】nn网络层

1、卷积层 1.1 Convolution 1.1.1 卷积操作 卷积运算&#xff1a;卷积核在输入信号&#xff08;图像&#xff09;上滑动&#xff0c;相应位置上进行乘加卷积核&#xff1a;又称为滤波器、过滤器&#xff0c;可认为是某种模式、某种特征 1.1.2 卷积维度 一般情况下&#xf…

Pinpoint - 大型分布式系统的 APM(应用性能管理)工具

文章目录 一、关于 Pinpoint最新版本&#xff08;2024/10/23&#xff09;-- v3.0.1PHP, PYTHON 二、概述支持的模块 一、关于 Pinpoint Pinpoint 是一个用于大型分布式系统的 APM&#xff08;应用性能管理&#xff09;工具&#xff0c;由 Java / PHP/PYTHON 编写。 受 Dapper …

设计模式实践:模板方法、观察者与策略模式详解

目录 1 模板方法1.1 模板方法基本概念1.2 实验1.2.1 未使用模板方法实现代码1.2.2 使用模板方法的代码 2 观察者模式2.1 观察者模式基本概念2.2 实验 3 策略模式3.1 策略模式基本概念3.2 实验 1 模板方法 1.1 模板方法基本概念 定义&#xff1a;一个操作中的算法的骨架 &…

Vue 2.0和3.0笔记

Vue 3 关于组件 今天回顾了下2.0关于组件的内容&#xff0c;3.0定义组件的方式多了一种就是通过单文件组件&#xff08;Single-File Component&#xff09;的方式将Vue的模板&#xff0c;逻辑和样式放到一个文件中&#xff0c;2.0则不同&#xff0c;它是将模板放到一个属性中…

前端面试-微前端

1. 什么是微前端&#xff1f;它的核心价值是什么&#xff1f; 答案&#xff1a; 微前端是一种将前端应用拆分为独立模块的架构模式&#xff0c;每个模块可由不同团队独立开发、测试、部署和运行。其核心价值包括&#xff1a; 技术栈无关性&#xff1a;支持 React、Vue、Angul…

Axure高保真AI算法训练平台

点击下载《Axure高保真AI算法训练平台(.rp) 》 原型效果&#xff1a;https://axhub.im/ax9/69fdf8f2b10b59c3/#g1 摘要 本文介绍了一款功能全面且高效的AI算法训练平台&#xff0c;旨在为数据科学家、研究人员和工程师提供从数据准备到模型部署的一站式解决方案。该平台由四大…

Ubuntu服务器日志满audit:backlog limit exceeded了会报错解决方案-Linux 审计系统 (auditd) 工具

auditd 是 Linux 系统中的审计守护进程&#xff0c;负责收集、记录和监控系统安全相关事件。以下是相关工具及其功能&#xff1a; 核心组件 auditd - 审计守护进程 系统的审计服务主程序 收集系统调用信息并写入日志文件 通常存储在 /var/log/audit/audit.log auditctl - 审计控…