如何使用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.pswp.cn/pingmian/77138.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77138.shtml
英文地址,請注明出處:http://en.pswp.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 - 審計控…