Spring Boot 啟動過程

廢物大師兄發表於2021-03-13

一切從SpringApplication.run()開始,最終返回一個ConfigurableApplicationContext

構造了一個SpringApplication物件,然後呼叫它的run方法。下面看下構造方法都做了什麼

1、推斷Web應用型別(WebApplicationType),本例中是SERVLET

2、設定 Bootstrapper、ApplicationContextInitializer 和 ApplicationListener

3、推斷main方法 

注意到,在設定 Bootstrapper、ApplicationContextInitializer 和 ApplicationListener 時,都呼叫了同一個方法getSpringFactoriesInstances

從所有 META-INF/spring.factories 檔案中載入,並查詢指定名稱的的值

回到之前的構造方法那裡,現在我們知道設定的Bootstrapper、ApplicationContextInitializer、ApplicationListener是從哪兒來的了,原來是在META-INF/spring.factories中配置的。查詢指定key對應的值,然後例項化它們,並返回一個List

接下來,重頭戲,呼叫run方法

重點看try裡面的內容

首先是啟動監聽器來監聽啟動過程,這裡再一次呼叫了熟悉的getSpringFactoriesInstances

然後,將main方法中傳的引數包裝成ApplicationArguments物件

緊接著,建立並配置環境,返回一個ConfigurableEnvironment物件,由於本例中是SERVLET,所以建立的是StandardServletEnvironment

然後,列印Banner

建立ApplicationContext,所有基於Spring的專案啟動過程都是建立ApplicationContext

這裡建立的ConfigurableApplicationContext是AnnotationConfigServletWebServerApplicationContext

有了ApplicationContext,緊接著要配置ApplicationContext

載入所有的source(其實就是class),然後例項化

這裡就是一個,就是啟動類

接下來,重新整理容器

最終是呼叫Spring的applicationContext.refresh(),又看到了熟悉的一幕

最後還留了一個入口,回撥子容器的onRefresh()

Spring MVC的啟動是建立父子兩個WebApplicationContext 

在重新整理容器之後,所有的Bean都已經例項化完成

afterRefresh什麼也沒做

最後是回撥Runner,回撥所有的ApplicationRunner和CommandLineRunner

至此,Spring Boot啟動完成

回顧一下,

1、推斷Web應用型別

2、設定Bootstrapper、ApplicationContextInitializer、ApplicationListener

3、推斷main方法

4、建立並配置環境Environment

5、列印Banner

6、建立並配置ApplicationContext

7、重新整理ApplicationContext(此處交由Spring處理,呼叫Spring的refresh()方法)例項化所有的bean

8、回撥所有的ApplicationRunner和CommandLineRunner

 

相關文章