SpringBoot2.X (十八): Spring Boot 啟動原理
導言
Spring Boot 大大簡化了我們的開發配置,節省了大量的時間,確實比較方便。但是對於新手來說,如果不瞭解箇中原理,難免會遇到一些坑。
ok,廢話不多說,我們進入正題:
我們所有的SringBoot 專案都會看到以下這個類:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
1、啟動類註解
首先,我們從註解看起,進入 @SpringBootApplication
原始碼可以看到,除了最基礎的註解外,還增加了三個 @SpringBootConfiguration
、@EnableAutoConfiguration
、@ComponentScan
,因此將 @SpringBootApplication
替換成以上三個也具有相同的效果,這一點,我們再前面的文章中也有提到
2、run
方法 簡單說明
我們知道,啟動類先呼叫了 SpringApplication 的靜態方法 run,跟蹤進去後發現,它會先例項化 SpringApplication,然後呼叫 run 方法。
所以,要想繼續分析run
方法,我們得先了解一下 SpringApplication
方法的構造過程
3、SpringApplication
方法構造過程分析說明
我們從上述地方,進入 SpringApplication 構造方法後,如下:
從 this
進入 :
通過上述程式碼,我們分析到 SpringApplication 例項化時有以下幾個步驟:
1). 將所有 sources 加入到全域性 sources 中,目前只有一個 Application。
2). 判斷 可能的web應用程式型別(WebApplicationType 是一個列舉類,包含 NONE, SERVLET, REAVTIVE 三種類型)。
3). 設定應用程式初始化器 ApplicationContextInitializer,做一些初始化的工作。
4).設定應用程式事件監聽器 ApplicationListener。
5).找出啟動類,設定到 mainApplicationClass 中
4、run
方法 再讀
回到我們進入 SpringApplication 之前的地方,再度進入run 方法
通過上述原始碼,我們可以將 run
方法執行流程分解如下:
1). 初始化 StopWatch,呼叫其 start 方法開始計時。
2). 呼叫 configureHeadlessProperty 設定系統屬性 java.awt.headless,這裡設定為 true,表示執行在伺服器端,在沒有顯示器和滑鼠鍵盤的模式下工作,模擬輸入輸出裝置功能。
3). 遍歷 SpringApplicationRunListeners 並呼叫 starting 方法。
4). 建立一個 DefaultApplicationArguments 物件,它持有 args 引數,就是 main 函式傳進來的引數呼叫 prepareEnvironment 方法。
5). 列印 banner。
6). 建立 Spring Boot 上下文。
7). 初始化 FailureAnalyzers。
8). 呼叫 prepareContext, 將上述內容載入到 上下文。
9). 呼叫 AbstractApplicationContext 的 refresh 方法,並註冊鉤子。
10). 在容器完成重新整理後,依次呼叫註冊的 Runners。
11). 呼叫 SpringApplicationRunListeners 的 finished 方法。
12). 啟動完成並停止計時。
13). 初始化過程中出現異常時呼叫 handleRunFailure 進行處理,然後丟擲 IllegalStateException 異常。
完
以上僅代表個人淺見,如有不正之處,還請指正,謝謝!
-- end --