Spring Boot的啟動流程,以及各個擴展點的執行順序

目錄

1. 初始化階段執行順序

1.1 Bean的構造方法(構造函數)

1.2?@PostConstruct?注解方法

1.3?InitializingBean?的?afterPropertiesSet()

1.4?@Bean(initMethod = "自定義方法")

2. 上下文就緒后的擴展點

2.1?ApplicationContext?事件監聽器

2.2?ApplicationRunner?與?CommandLineRunner

3. 完整執行順序總結

4. 控制執行順序的方法

5. 示例代碼驗證


????????在Spring Boot應用中,容器初始化及組件執行的順序遵循特定的生命周期。以下是常見的初始化組件及其執行順序的詳細說明,幫助您合理控制代碼邏輯的加載順序。


1. 初始化階段執行順序

以下是Spring Boot應用啟動時,各初始化方法的執行順序(從上到下依次執行):

1.1 Bean的構造方法(構造函數)
  • 觸發時機:Bean實例化時。
  • 說明:Bean被容器創建時,構造函數首先被調用。
@Component
public class MyBean {public MyBean() {System.out.println("構造方法執行");}
}
1.2?@PostConstruct?注解方法
  • 觸發時機:Bean依賴注入完成后。
  • 說明:在Bean屬性賦值(如@Autowired注入)之后執行。
@Component
public class MyBean {@PostConstructpublic void init() {System.out.println("@PostConstruct方法執行");}
}
1.3?InitializingBean?的?afterPropertiesSet()
  • 觸發時機:與@PostConstruct類似,但由Spring原生接口提供。
  • 說明:在Bean屬性設置完成后執行,優先于自定義的init-method
@Component
public class MyBean implements InitializingBean {@Overridepublic void afterPropertiesSet() {System.out.println("InitializingBean的afterPropertiesSet執行");}
}
1.4?@Bean(initMethod = "自定義方法")
  • 觸發時機:在@PostConstructInitializingBean之后執行。
  • 說明:通過@Bean注解顯式指定的初始化方法。
@Configuration
public class AppConfig {@Bean(initMethod = "customInit")public AnotherBean anotherBean() {return new AnotherBean();}
}public class AnotherBean {public void customInit() {System.out.println("@Bean的initMethod執行");}
}

2. 上下文就緒后的擴展點

當所有Bean初始化完成后,應用進入上下文就緒階段:

2.1?ApplicationContext?事件監聽器
  • ContextRefreshedEvent?監聽器:當ApplicationContext初始化或刷新完成后觸發。
    @Component
    public class MyContextListener {@EventListener(ContextRefreshedEvent.class)public void onContextRefreshed() {System.out.println("ContextRefreshedEvent事件觸發");}
    }
    
2.2?ApplicationRunner?與?CommandLineRunner
  • 觸發時機:在上下文就緒后、應用啟動完成前執行。
  • 執行順序:通過@Order或實現Ordered接口控制多個Runner的順序。
    @Component
    @Order(1)
    public class MyAppRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) {System.out.println("ApplicationRunner執行");}
    }@Component
    @Order(2)
    public class MyCmdRunner implements CommandLineRunner {@Overridepublic void run(String... args) {System.out.println("CommandLineRunner執行");}
    }
    

3. 完整執行順序總結

以下是典型場景下各組件的執行順序:

  1. Bean構造函數 →?@PostConstruct?→?InitializingBean?→?@Bean(initMethod)
  2. ContextRefreshedEvent?監聽器
  3. ApplicationRunner?→?CommandLineRunner

4. 控制執行順序的方法

  • @Order?注解:為ApplicationRunnerCommandLineRunner和事件監聽器指定優先級,值越小優先級越高。
  • @DependsOn?注解:強制指定Bean的依賴關系,間接影響初始化順序。
  • 實現Ordered接口:替代@Order注解,動態控制順序。

5. 示例代碼驗證

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

輸出結果

構造方法執行
@PostConstruct方法執行
InitializingBean的afterPropertiesSet執行
@Bean的initMethod執行
ContextRefreshedEvent事件觸發
ApplicationRunner執行
CommandLineRunner執行

通過理解這些執行順序,您可以更精準地安排初始化邏輯(如數據庫連接、緩存預熱等),避免因順序問題導致的依賴錯誤。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83051.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83051.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83051.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

刀具問題討論

1 刀具的問題概述 問題描述 一道工序用自動化車床連續加工某種零件,由于刀具損壞等原因該工序會出現故障,其中刀具損壞故障占95%, 其它故障僅占 5%。工序出現故障是完全隨機的, 假定在生產任一零件時出現故障的機會均相同。工作人員通過檢查零件來確定…

vite配置一個css插件

vite.config.js的plugins執行函數 該例子只是替換一些css,具體內容不重要,主要看形參的運用 // vite-plugin-css.js export default function cssPlugin() {return {name: vite-plugin-css-post, // 插件的名字,Vite 插件必須有名字enforce: post, // 設定插件執…

?1.1.1 按位與運算替代求余運算優化場景

在計算機編程中,使用按位與運算(&)替代求余運算(%)可以提高效率的特殊場景是:當除數是 2 的整數次冪(即 ( b 2^n ),其中 ( n ) 為自然數)時。例如,( b …

CentOS 7 環境中部署 LNMP(Linux + Nginx + MySQL 5.7 + PHP)

在 CentOS 7 環境中部署 LNMP(Linux Nginx MySQL 5.7 PHP) 環境的詳細步驟如下。此方案確保各組件版本兼容,并提供完整的配置驗證流程。 1. 更新系統 sudo yum update -y 2. 安裝 MySQL 5.7 2.1 添加 MySQL 官方 YUM 倉庫 由于MySQL并不…

UniApp微信小程序自定義導航欄實現

UniApp微信小程序自定義導航欄 在UniApp開發微信小程序時,頁面左上角默認有一個返回按鈕(在導航欄左側),但有時我們需要自定義這個按鈕的樣式和功能,同時保持與導航欄中間的標題和右側膠囊按鈕(藥丸屏&…

Java大師成長計劃之第35天:未來展望與個人總結

引言 作為一門歷史悠久的編程語言,Java自1995年問世以來,經歷了多個版本的迭代與演進,依然在當今技術生態中占據著重要地位。從早期的Java SE、Java EE到后來的Java Spring框架,再到現代的微服務架構與云原生應用,Jav…

Ubuntu開機自動運行Docker容器中的Qt UI程序

Ubuntu開機自動運行Docker容器中的Qt UI程序 引言為什么需要這樣配置?解決方案概覽詳細實現步驟1. 創建容器啟動腳本2. 創建系統服務3. 配置自動登錄和顯示設置常見問題解決方案1. 程序無法顯示(X11權限問題)2. 分辨率設置不生效3. 服務啟動失敗安全注意事項結語附錄:完整文…

Scratch節日 | 龍舟比賽 | 端午節

端午節快樂! 這款專為孩子們打造的Scratch游戲——《龍舟比賽》,讓你在掌控龍舟的競速中,沉浸式體驗中華傳統節日的魅力! 🎮 游戲亮點 節日氛圍濃厚:化身龍舟選手,在波濤洶涌的河流中展開刺激競…

(五)MMA(OpenTelemetry/Rabbit MQ/ApiGateway/MongoDB)

文章目錄 項目地址一、OpenTelemetry1.1 配置OpenTelemetry1. 服務添加2. 添加服務標識3. 添加請求的標識4. 添加中間價 二、Rabbit MQ2.1 配置Rabbit MQ1. docker-compose2. 添加Rabbit MQ的Connect String 2.2 替換成Rabbit MQ1. 安裝所需要的包2. 使用 三、API Gateways3.1 …

格恩朗超聲波水表 助力農業精準灌溉與振興?

在農業現代化的征程中,水資源的精準利用至關重要,而這離不開高精度計量設備的支持。大連格恩朗品牌積極響應國家全面推進鄉村振興、加快農業農村現代化的號召,精心打造的超聲波水表,憑借其超高精度,成為綠色灌溉領域的…

微信小程序頁面嵌套web-view點擊系統導航返回時進行彈窗處理

實現效果:微信小程序頁面嵌套web-view點擊系統導航返回時進行彈窗處理 首先在web-view里是不可實現的(據我了解下來) 參考小程序文檔:page-container 大致邏輯: 1、page-container可實現頁面離開前攔截 2、由于web-vie…

設計模式25——中介者模式

寫文章的初心主要是用來幫助自己快速的回憶這個模式該怎么用,主要是下面的UML圖可以起到大作用,在你學習過一遍以后可能會遺忘,忘記了不要緊,只要看一眼UML圖就能想起來了。同時也請大家多多指教。 中介者模式(Mediat…

Java基礎 Day25

一、線程通信 1、簡介 確保線程能夠按照預定的順序執行并且能夠安全地訪問共享資源 使多條線程更好的進行協同工作 2、常用方法 void wait() 使當前線程進入等待狀態 void notify(); 隨機喚醒單個等待的線程(可以空喚醒) void notifyAll(); 喚醒…

WebSocket與實時對話式AI服務的集成

WebSocket與實時對話式AI服務的集成 在現代對話式AI系統中,傳統的HTTP請求-響應模型已難以滿足實時交互的體驗需求。特別是用戶對響應速度、逐字輸出、會話上下文保持等方面提出更高要求時,需要一種能夠建立持久連接并支持雙向通信的協議。WebSocket正是在這一背景下,成為A…

iOS 集成網易云信IM

云信官方文檔在這 看官方文檔的時候&#xff0c;版本選擇最新的V10。 1、CocoPods集成 pod NIMSDK_LITE 2、AppDelegate.m添加頭文件 #import <NIMSDK/NIMSDK.h> 3、初始化 NIMSDKOption *mrnn_option [NIMSDKOption optionWithAppKey:"6f6568e354026d2d658a…

人工智能100問?第37問:什么是擴散模型?

目錄 ??一、通俗解釋 二、專業解析?? 三、權威參考 擴散模型是一種??通過系統性地添加再去除噪聲來生成新數據(如圖像)的生成式AI技術??,其核心機制分為兩個階段:正向擴散??:對原始數據(如清晰圖片)逐步添加噪聲,直至完全變成隨機噪點(類似老照片逐漸模糊…

傳輸層核心技術解析

目錄 一、端口號機制 二、網絡診斷工具 1. netstat命令 2. pidof工具 三、UDP協議詳解 協議特征 典型應用場景 四、TCP協議深度解析 核心機制 狀態轉換模型 特殊狀態說明 五、協議對比分析 六、開發實踐要點 一、端口號機制 核心作用&#xff1a;標識主機唯一進程…

IO Vs NIO

一、IO(傳統阻塞式) 全稱?&#xff1a;Input/Output(輸入/輸出) 定義?&#xff1a;Java 1.0 引入的基礎 I/O 模型&#xff0c;基于流&#xff08;Stream&#xff09;的同步阻塞操作&#xff0c;線程在讀寫數據時會阻塞直到操作完成。 二、NIO(新式非阻塞式) ?全…

基于原生JavaScript前端和 Flask 后端的Todo 應用

Demo地址&#xff1a;https://gitcode.com/rmbnetlife/todo-app-js-flask.git Python Todo 應用 這是一個使用Python Flask框架開發的簡單待辦事項(Todo)應用&#xff0c;采用前后端分離架構。本項目實現了待辦事項的添加、刪除、狀態切換等基本功能&#xff0c;并提供了直觀…

005 ElasticSearch 許可證過期問題

ElasticSearch 許可證過期問題 項目啟動報錯 org.elasticsearch.client.ResponseException: method [GET], host [http://127.0.0.1:9200], URI [/_cluster/health/], status line [HTTP/1.1 403 Forbidden] {"error":{"root_cause":[{"type":…