javascript
Spring Boot 应用程序启动流程分析
SpringBoot 有兩個關(guān)鍵元素:
@SpringBootApplication
SpringApplication 以及 run() 方法
?
SpringApplication 這個類應(yīng)該算是 Spring Boot 框架的“創(chuàng)新”產(chǎn)物了,原始的 Spring 中并沒有這個類,SpringApplication 中封裝了一套 Spring 應(yīng)用的啟動流程,然而這對用戶完全透明,因此我們上手 Spring Boot 時感覺很簡潔、輕量。
?
一般來說默認的 SpringApplication 執(zhí)行流程已經(jīng)可以滿足大部分需求,但是若用戶想干預(yù)這個過程,則可以通過 SpringApplication 在流程某些地方開啟擴展點來完成對流程的擴展,典型的擴展方案那就是使用 set 方法。
?
比如,把我們天天司空見慣的 Spring Boot 應(yīng)用的啟動類來拆解一下寫出來就是這樣:
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 );} }?
?
這樣一拆解后我們發(fā)現(xiàn),我們也需要先構(gòu)造 SpringApplication 類對象,然后調(diào)用該對象的 run() 方法。那么接下來就講講 SpringApplication 的構(gòu)造過程 以及其 run() 方法的流程,搞清楚了這個,那么也就搞清楚了SpringBoot應(yīng)用是如何運行起來的!
?
SpringApplication 實例的初始化
我們對照代碼來看:
?
?
四個關(guān)鍵的步驟已標(biāo)注在圖中,分別解釋如下:
① 推斷應(yīng)用的類型:創(chuàng)建的是 REACTIVE應(yīng)用、SERVLET應(yīng)用、NONE 三種中的某一種
?
?
② 使用 SpringFactoriesLoader查找并加載 classpath下 META-INF/spring.factories文件中所有可用的 ApplicationContextInitializer
?
?
③ 使用 SpringFactoriesLoader查找并加載 classpath下 META-INF/spring.factories文件中的所有可用的 ApplicationListener
?
?
④ 推斷并設(shè)置 main方法的定義類
?
?
SpringApplication 的run()方法探秘
先看看代碼長啥樣子:
?
?
各個主要步驟我已經(jīng)標(biāo)注在上圖之中了,除此之外,我也按照自己的理解畫了一個流程圖如下所示,可以對照數(shù)字標(biāo)示看一下:
?
?
我們將各步驟總結(jié)精煉如下:
?
1、通過 SpringFactoriesLoader 加載 META-INF/spring.factories 文件,獲取并創(chuàng)建 SpringApplicationRunListener 對象
?
2、然后由 SpringApplicationRunListener 來發(fā)出 starting 消息
?
3、創(chuàng)建參數(shù),并配置當(dāng)前 SpringBoot 應(yīng)用將要使用的 Environment
?
4、完成之后,依然由 SpringApplicationRunListener 來發(fā)出 environmentPrepared 消息
?
5、創(chuàng)建 ApplicationContext
?
6、初始化 ApplicationContext,并設(shè)置 Environment,加載相關(guān)配置等
?
7、由 SpringApplicationRunListener 來發(fā)出 contextPrepared 消息,告知SpringBoot 應(yīng)用使用的 ApplicationContext 已準(zhǔn)備OK
?
8、將各種 beans 裝載入 ApplicationContext,繼續(xù)由 SpringApplicationRunListener 來發(fā)出 contextLoaded 消息,告知 SpringBoot 應(yīng)用使用的 ApplicationContext 已裝填OK
?
9、refresh ApplicationContext,完成IoC容器可用的最后一步
?
10、由 SpringApplicationRunListener 來發(fā)出 started 消息
?
11、完成最終的程序的啟動
?
12、由 SpringApplicationRunListener 來發(fā)出 running 消息,告知程序已運行起來了
?
至此,全流程結(jié)束!
總結(jié)
以上是生活随笔為你收集整理的Spring Boot 应用程序启动流程分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11.前台文件数据流下载获取源文件名
- 下一篇: 往hdfs写数据无权限