javascript
SpringBoot 应用程序启动过程探秘
本文共 946字,閱讀大約需要 3分鐘 !
概述
說到接觸 SpringBoot 伊始,給我第一映像最深的是有兩個(gè)關(guān)鍵元素:
對(duì)照上面的典型代碼,這個(gè)兩個(gè)元素分別是:
- @SpringBootApplication
- SpringApplication 以及 run() 方法
關(guān)于 @SpringBootApplication 注解的剖析已經(jīng)在上文:《SpringBoot 中 @SpringBootApplication注解背后的三體結(jié)構(gòu)探秘》 中完成了,其實(shí)它背后就是一個(gè)三體結(jié)構(gòu),只是 SpringBoot給了其一個(gè)包裝而已。那么本文我們就來看看這個(gè) SpringApplication 以及 run() 方法 到底是個(gè)什么鬼,它背后又隱藏了哪些奧秘呢?
注: 本文首發(fā)于 My Personal Blog,歡迎光臨 小站本文內(nèi)容腦圖如下:
SpringApplication 驚鴻一瞥
SpringApplication 這個(gè)類應(yīng)該算是 SpringBoot 框架 的“創(chuàng)新”產(chǎn)物了,原始的 Spring中并沒有這個(gè)類,SpringApplication 里面封裝了一套 Spring 應(yīng)用的啟動(dòng)流程,然而這對(duì)用戶完全透明,因此我們上手 SpringBoot 時(shí)感覺簡(jiǎn)潔、輕量。
一般來說默認(rèn)的 SpringApplication 執(zhí)行流程已經(jīng)可以滿足大部分需求,但是 若用戶想干預(yù)這個(gè)過程,則可以通過 SpringApplication 在流程某些地方開啟的 擴(kuò)展點(diǎn) 來完成對(duì)流程的擴(kuò)展,典型的擴(kuò)展方案那就是使用 set 方法。
我們來舉一個(gè)栗子,把我們天天司空見慣的 SpringBoot 應(yīng)用的啟動(dòng)類來拆解一下寫出來:
@SpringBootApplication public class CodeSheepApplication {public static void main( String[] args ) {// SpringApplication.run( CodeSheepApplication.class args ); // 這是傳統(tǒng)SpringBoot應(yīng)用的啟動(dòng),一行代碼搞定,內(nèi)部默認(rèn)做了很多事SpringApplication app = new SpringApplication( CodeSheepApplication.class );app.setXXX( ... ); // 用戶自定的擴(kuò)展在此 !!!app.run( args );} }這樣一拆解后我們發(fā)現(xiàn),我們也需要先構(gòu)造 SpringApplication 類對(duì)象,然后調(diào)用該對(duì)象的 run() 方法。那么接下來就講講 SpringApplication 的構(gòu)造過程 以及其 run() 方法的流程,搞清楚了這個(gè),那么也就搞清楚了SpringBoot應(yīng)用是如何運(yùn)行起來的!
SpringApplication 實(shí)例的初始化
我們對(duì)照代碼來看:
四個(gè)關(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()方法探秘
先看看代碼長(zhǎng)啥樣子:
各個(gè)主要步驟我已經(jīng)標(biāo)注在上圖之中了,除此之外,我也按照自己的理解畫了一個(gè)流程圖如下所示,可以對(duì)照數(shù)字標(biāo)示看一下:
我們將各步驟總結(jié)精煉如下:
至此,全流程結(jié)束!
后記
由于能力有限,若有錯(cuò)誤或者不當(dāng)之處,還請(qǐng)大家批評(píng)指正,一起學(xué)習(xí)交流!- My Personal Blog
- 我的半年技術(shù)博客之路
總結(jié)
以上是生活随笔為你收集整理的SpringBoot 应用程序启动过程探秘的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7 Zabbix3.4安装
- 下一篇: Java GUI:将JPanel添加进J