Spring Boot 啟動過程
- 2021 年 3 月 13 日
- 筆記
- springboot
一切從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