SpringBoot初始化分析

之前分析過Spring的初始化過程,現在由於微服務的流行,大家紛紛用起了SpringBoot,爲了跟上潮流,這裏也簡單分析一下SpringBoot的啓動過程。

使用springboot啓動一個微服務十分簡單,只需要在啓動類上調用SpringApplication的run方法即可。

我們進入run方法進行分析,最終會調用如下方法

我們看到在調用run方法之前會實例化一個SpringApplication,在其的構造函數中會調用initialize方法,該主要有倆個作用,判斷該應用是否是web應用以及設置初始化與監聽器集合。在META-INF下的spring.factories文件中我們可以看到相應的Initializers類與Listeners類名。

繼續分析,來到主要的run方法。

先來說一下前半部分,StopWatch用於記錄啓動時長,啓動SpringApplicationRunListeners監聽器,printBanner用於打印項目啓動時控制檯輸出的圖像(推薦一個將圖片轉化爲字符的網站http://www.degraeve.com/img2txt.php 我們可以將自己的頭像自定義成banner),自定義banner比較簡單,不詳說了。註冊失敗分析器等。

接下來是比較重要的三個步驟了,我們一一分析。

首先是prepareContext方法。

可以看到這裏主要做一些事前準備工作,包括設置環境變量,執行Initializers的初始化方法,執行監聽器的prepare方法,註冊springboot特有的一些單例bean等。

第二個步驟是refreshContext,創建新的context容器

我們一步步跟進去發現,最終會調用refresh方法,如果熟悉spring的同學應該對這個方法比較熟悉了,springboot最終也會調用到spring初始化的邏輯中,關於refresh方法內部的分析,可以看我之前寫的文章,這裏不再贅述。

最後一個步驟afterRefresh

找出容器中的ApplicationRunner與CommandLineRunner並執行其的run方法,我們可以實現自己的runner用於執行一些程序啓動自定義邏輯。

經歷這三個步驟之後,接下來是一些收尾工作,停止計時,調用監聽器finish方法等,最終返回新建的context對象。

到這裏主要的初始化邏輯已經分析完了。其實springboot和spring基本是一樣的,熟悉spring的同學應該會很容易上手springboot的源碼,之前看spring的源碼付出的努力還是沒有白費的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章