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