Spring Boot 啟動過程


一切從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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM