SpringBoot應用的啟動方式很簡單,就一行代碼,如下圖01:
其實這行代碼背后主要執行兩個方法,一個是構造方法,一個是run方法。
構造方法主要內容就是收集一些數據,和確認一些信息。如下圖02:
真正的執行要從run方法開始,為此,SpringBoot特意定義了一個監聽器,專門監聽這個run方法的執行過程。
這個監聽器的名字是,SpringApplicationRunListener,如下圖03:
這個接口的方法其實就表示了SpringBoot應用的啟動過程。
備注:這個監聽器是SpringBoot自己使用的,我們雖然也可以使用,但有些麻煩。
第一步,啟動
當進入run方法后,首先就是獲取監聽器,並觸發starting方法。
應用正式開始啟動,如下圖04:
第二步,准備環境
最先要准備好的就是Environment,因為后續要使用它。
它里面的值也包含啟動時的命令行參數,如下圖05:
此時會觸發監聽器的environmentPrepared方法,如下圖06:
第三步,創建容器
根據應用類型創建適合的Spring容器,如下圖07:
第四步,准備容器
主要包括把Environment設置給容器,執行容器的自定義初始化器。
同時觸發監聽器的contextPrepared方法,如下圖08:
第五步,加載資源
這里的資源主要包括應用的主類,還有用戶顯式設置的類名/包名/XML文件等。
加載這些資源的目的就是為了注冊bean定義。
然后再觸發監聽器的contextLoaded方法,如下圖09:
第六步,容器刷新
容器刷新主要包括調用“后處理器”進一步注冊bean定義。
還包括對所有(非延遲加載)單例bean的實例化和初始化。如下圖10:
此時,其實Spring容器已經啟動成功了。所以觸發了監聽器的started方法。
表明已經啟動了,如下圖11:
第七步,調用Runner接口
Runner接口就是容器啟動成功后馬上就會被執行的。它的實現類作為bean注冊到容器中。
所以是從容器中拿出這些bean再執行,如下圖12:
此時,啟動過程需要執行的所有東西都已完成。
因此,要觸發監聽器的running方法,表明已經進入正常運行狀態,如下圖13:
run方法也已經結束了,就把容器對象返回了,如下圖14:
(END)
>>> 玩轉SpringBoot系列文章 <<<
【玩轉SpringBoot】用好條件相關注解,開啟自動配置之門
【玩轉SpringBoot】看似復雜的Environment其實很簡單
【玩轉SpringBoot】讓錯誤處理重新由web服務器接管
>>> 品Spring系列文章 <<<
品Spring:SpringBoot和Spring到底有沒有本質的不同?
品Spring:SpringBoot輕松取勝bean定義注冊的“第一階段”
品Spring:SpringBoot發起bean定義注冊的“二次攻堅戰”
品Spring:注解之王@Configuration和它的一眾“小弟們”
品Spring:對@PostConstruct和@PreDestroy注解的處理方法
品Spring:對@Autowired和@Value注解的處理方法
品Spring:真沒想到,三十步才能完成一個bean實例的創建
品Spring:關於@Scheduled定時任務的思考與探索,結果尷尬了
>>> 熱門文章集錦 <<<
爸爸又給Spring MVC生了個弟弟叫Spring WebFlux
【面試】吃透了這些Redis知識點,面試官一定覺得你很NB(干貨 | 建議珍藏)
【面試】如果你這樣回答“什么是線程安全”,面試官都會對你刮目相看(建議珍藏)
【面試】迄今為止把同步/異步/阻塞/非阻塞/BIO/NIO/AIO講的這么清楚的好文章(快快珍藏)
【面試】一篇文章幫你徹底搞清楚“I/O多路復用”和“異步I/O”的前世今生(深度好文,建議珍藏)
作者是工作超過10年的碼農,現在任架構師。喜歡研究技術,崇尚簡單快樂。追求以通俗易懂的語言解說技術,希望所有的讀者都能看懂並記住。下面是公眾號的二維碼,歡迎關注!