1. 程式人生 > >SpringBoot2.X (十八): Spring Boot 啟動原理

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 --