你真的知道Spring Boot是如何啓動的嗎?這裡一定有你不知道的

Spring Boot作為一個非常流行的微服務框架,在java面試中越來越多被提問。其中Springboot啟動過程是一個非常熱門的問題,這個問題主要考察了被面試者對於Springboot基本原理以及依賴反轉和注入相關內容的理解。

今天我們來一起看看Springboot的啟動過程。

Context創建過程

下圖是實現Context創建過程的方法。在這個方法中主要是判斷當前是什麼web容器,然後選擇合適的Context實現類,並實例化Context。

你真的知道Spring Boot是如何啟動的嗎?這裡一定有你不知道的

創建Context

這個標識當前web App類型的webApplicationType是怎麼得到的呢?通過翻閱代碼,我們可以發現他是在deduceWebApplicationType中完成的,具體過程如下圖:

你真的知道Spring Boot是如何啟動的嗎?這裡一定有你不知道的

Web App類型確定過程

這個方法的原理就是嘗試查找各個Web App中特有的類,如果發現了某個Web App特有的類,認為是對應類型的Web App。具體各個類型對應的類名稱可以在源碼中直接看到,這裡就不再贅述。

當確定好了Web App類,就要去實例化Context,實例化的過程是通過調用BeanUtils.instantiateClass來完成。

Context準備過程

當Context被創建以後,就需要給這個Context事例進行一些初始化工作,這個過程是在prepareContext完成的。

首先調用postProcessApplicationContext方法,這個方法會根據需要來設置beanNameGenerator,resourceLoader和classLoader。實現代碼如下圖所示:

你真的知道Spring Boot是如何啟動的嗎?這裡一定有你不知道的

postProcessApplicationContext方法

接下來調用applyInitializers,這個方法會調用initializers列表中每一個對象的initialize方法。initializers中存放的都是具有ApplicationContextInitializer接口的對象實例。

那麼這個initializers是在什麼地方被填充的呢?

在SpringApplication的構造函數中我們發現調用了setInitializers,這方法的參數則是調用

getSpringFactoriesInstances(ApplicationContextInitializer.class)

獲取到的。

getSpringFactoriesInstances是Springboot中一個非常重要的方法,這個方法會根據spring.factories讀取對應接口的配置,其實現思想類似於Java中的SPI特性,後續如果有機會將會單獨分析這個spring.factories的實現過程。

你真的知道Spring Boot是如何啟動的嗎?這裡一定有你不知道的

spring.factories文件

最後會調用load方法來把bean加載到Context中,最終會調用到BeanDefinitionLoader中的各種load方法。

你真的知道Spring Boot是如何啟動的嗎?這裡一定有你不知道的

load方法

通過上面的三步,Context已經被準備好了,接下來就可以進行refresh。

待續

限於篇幅限制,本文就先分析Context的創建

準備過程。Context的刷新和依賴注入相關的內容將會在接下來的文章中進一步分析,歡迎大家關注我的頭條號。


分享到:


相關文章: