SpringApplication物件是如何構建的? SpringBoot原始碼(八)
阿新 • • 發佈:2020-04-06
**注:該原始碼分析對應SpringBoot版本為2.1.0.RELEASE**
本篇接 [SpringBoot的啟動流程是怎樣的?SpringBoot原始碼(七)](https://juejin.im/post/5e771657f265da574c569be1)
# 1 溫故而知新
溫故而知新,我們來簡單回顧一下上篇的內容,上一篇我們分析了**SpringBoot的啟動流程**,現將關鍵步驟再濃縮總結下:
1. 構建`SpringApplication`物件,用於啟動SpringBoot;
2. 從`spring.factories`配置檔案中載入`EventPublishingRunListener`物件用於在不同的啟動階段發射不同的生命週期事件;
3. 準備環境變數,包括系統變數,環境變數,命令列引數及配置檔案(比如`application.properties`)等;
4. 建立容器`ApplicationContext`;
5. 為第4步建立的容器物件做一些初始化工作,準備一些容器屬性值等,同時呼叫各個`ApplicationContextInitializer`的初始化方法來執行一些初始化邏輯等;
6. 重新整理容器,這一步至關重要,是重點中的重點,太多複雜邏輯在這裡實現;
7. 呼叫`ApplicationRunner`和`CommandLineRunner`的run方法,可以實現這兩個介面在容器啟動後來載入一些業務資料等;
在SpringBoot啟動過程中,每個不同的啟動階段會分別發射不同的內建生命週期事件,然後相應的監聽器會監聽這些事件來執行一些初始化邏輯工作比如`ConfigFileApplicationListener`會監聽`onApplicationEnvironmentPreparedEvent`事件來載入環境變數等。
# 2 引言
上篇文章在講解SpringBoot的啟動流程中,我們有看到新建了一個`SpringApplication`物件用來啟動SpringBoot專案。那麼,我們今天就來看看`SpringApplication`物件的構建過程,同時講解一下SpringBoot自己實現的SPI機制。
# 3 SpringApplication物件的構建過程
本小節開始講解`SpringApplication`物件的構造過程,因為一個物件的構造無非就是在其建構函式裡給它的一些成員屬性賦值,很少包含其他額外的業務邏輯(當然有時候我們可能也會在建構函式裡開啟一些執行緒啥的)。那麼,我們先來看下構造`SpringApplication`物件時需要用到的一些成員屬性哈:
```java
// SpringApplication.java
/**
* SpringBoot的啟動類即包含main函式的主類
*/
pri