Spring Boot 應用程式啟動流程分析
SpringBoot 有兩個關鍵元素:
@SpringBootApplication
SpringApplication 以及 run() 方法
SpringApplication 這個類應該算是 Spring Boot 框架的“創新”產物了,原始的 Spring 中並沒有這個類,SpringApplication 中封裝了一套 Spring 應用的啟動流程,然而這對使用者完全透明,因此我們上手 Spring Boot 時感覺很簡潔、輕量。
一般來說預設的 SpringApplication 執行流程已經可以滿足大部分需求,但是若使用者想幹預這個過程,則可以通過 SpringApplication 在流程某些地方開啟擴充套件點來完成對流程的擴充套件,典型的擴充套件方案那就是使用 set 方法。
比如,把我們天天司空見慣的 Spring Boot 應用的啟動類來拆解一下寫出來就是這樣:
@SpringBootApplication
public class CodeSheepApplication {
public static void main( String[] args ) {
//SpringApplication.run( CodeSheepApplication.class args );
SpringApplication app = new SpringApplication( CodeSheepApplication.class );
app.setXXX( ... ); // 使用者自定的擴充套件在此 !!!
app.run( args );
}
}
這樣一拆解後我們發現,我們也需要先構造 SpringApplication 類物件,然後呼叫該物件的 run() 方法。那麼接下來就講講 SpringApplication 的構造過程 以及其 run() 方法的流程,搞清楚了這個,那麼也就搞清楚了SpringBoot應用是如何執行起來的!
SpringApplication 例項的初始化
我們對照程式碼來看:
四個關鍵的步驟已標註在圖中,分別解釋如下:
① 推斷應用的型別:建立的是 REACTIVE應用、SERVLET應用、NONE 三種中的某一種
② 使用 SpringFactoriesLoader查詢並載入 classpath下 META-INF/spring.factories檔案中所有可用的 ApplicationContextInitializer
③ 使用 SpringFactoriesLoader查詢並載入 classpath下 META-INF/spring.factories檔案中的所有可用的 ApplicationListener
④ 推斷並設定 main方法的定義類
SpringApplication 的run()方法探祕
先看看程式碼長啥樣子:
各個主要步驟我已經標註在上圖之中了,除此之外,我也按照自己的理解畫了一個流程圖如下所示,可以對照數字標示看一下:
我們將各步驟總結精煉如下:
1、通過 SpringFactoriesLoader 載入 META-INF/spring.factories 檔案,獲取並建立 SpringApplicationRunListener 物件
2、然後由 SpringApplicationRunListener 來發出 starting 訊息
3、建立引數,並配置當前 SpringBoot 應用將要使用的 Environment
4、完成之後,依然由 SpringApplicationRunListener 來發出 environmentPrepared 訊息
5、建立 ApplicationContext
6、初始化 ApplicationContext,並設定 Environment,載入相關配置等
7、由 SpringApplicationRunListener 來發出 contextPrepared 訊息,告知SpringBoot 應用使用的 ApplicationContext 已準備OK
8、將各種 beans 裝載入 ApplicationContext,繼續由 SpringApplicationRunListener 來發出 contextLoaded 訊息,告知 SpringBoot 應用使用的 ApplicationContext 已裝填OK
9、refresh ApplicationContext,完成IoC容器可用的最後一步
10、由 SpringApplicationRunListener 來發出 started 訊息
11、完成最終的程式的啟動
12、由 SpringApplicationRunListener 來發出 running 訊息,告知程式已執行起來了
至此,全流程結束!
相關文章
- Spring Boot啟動流程Spring Boot
- Android應用啟動流程分析Android
- Spring Boot啟動流程簡述Spring Boot
- framework——應用程式啟動流程Framework
- 在Spring Boot應用啟動時如何執行程式碼? -DukesletterSpring Boot行程
- Spring Boot原始碼分析-啟動過程Spring Boot原始碼
- Android 應用啟動流程Android
- flutter 應用啟動流程Flutter
- Spring Boot 應用程式中的 QueryDSLSpring Boot
- Spring Boot + Kotlin + Coroutines應用演示程式Spring BootKotlin
- Spring Boot應用程式事件教程 - reflectoringSpring Boot事件
- Spring Boot應用程式有哪些功能?Spring Boot
- Spring Boot(三):Spring Boot中的事件的使用 與Spring Boot啟動流程(Event 事件 和 Listeners監聽器)Spring Boot事件
- 如何在Spring Boot應用程式中啟用GZIP壓縮? | 前端後端Spring Boot前端後端
- spring-boot啟動Springboot
- 你知道如何自動儲存 Spring Boot 應用程式號嗎Spring Boot
- Spring Shell應用程式開發流程解析Spring
- Android App應用啟動流程(一)AndroidAPP
- Spring Boot 啟動過程Spring Boot
- Spring Boot Starters啟動器Spring Boot
- Spring Boot Runner啟動器Spring Boot
- 在Spring Boot應用程式中使用Kubernetes ConfigMapSpring Boot
- 精盡Spring Boot原始碼分析 - SpringApplication 啟動類的啟動過程Spring Boot原始碼APP
- Spring Boot 3用CDS提升20%啟動時間Spring Boot
- Spring Boot 啟動原始碼解析結合Spring Bean生命週期分析Spring Boot原始碼Bean
- Unbound啟動流程分析
- FlutterApp啟動流程分析FlutterAPP
- Activity啟動流程分析
- nodejs啟動流程分析NodeJS
- Spring Boot應用程式中的常用註釋列表Spring Boot
- Java SpringBoot 應用使用命令列 mvn spring-boot run 啟動的原理JavaSpring Boot命令列
- Maven專案Spring Boot啟動MavenSpring Boot
- Android 8.0 原始碼分析 (三) 應用程式程式建立到應用程式啟動的過程Android原始碼
- 使用谷歌Skaffold在Kubernetes上進行Spring Boot應用程式的CI / CD工作流程 - foojay谷歌Spring Boot
- spring boot 載入web容器tomcat流程原始碼分析Spring BootWebTomcat原始碼
- Spring Boot 3.3 正式釋出,王炸級更新,應用啟動速度直接起飛!Spring Boot
- 如何在Spring Boot應用啟動之後立刻執行一段邏輯Spring Boot
- Spring boot應用如何支援httpsSpring BootHTTP