Springboot啟動流程

1. 執(zhí)行SpringApplication的靜態(tài)run方法會實例化了一個SpringApplication對象,調(diào)用的是該類的有參構造方法。

2. SpringApplication實例初始化完成并且完成設置后,開始執(zhí)行run方法,首先遍歷執(zhí)行所有通過SpringFactoriesLoader查找到并加載的SpringApplicationRunListener,調(diào)用它們的starting()方法。

3. 準備并配置當前Spring Boot應用程序要使用的Environment(包括PropertySource和Profiles)。

4. 遍歷執(zhí)行所有SpringApplicationRunListener的environmentPrepared()的方法。比如創(chuàng)建ApplicationContext。

5. 判斷SpringApplication的bannerMode,是CONSOLE則輸出banner到System.out,是OFF則不打印,是LOG則輸出到日志文件中。

6. 判斷是否設置applicationContextClass屬性,如果有,則實例化該class;如果沒有,則判斷是否是Web環(huán)境,如果是DEFAULT_WEB_CONTEXT_CLASS,則實例化該常量所對應的AnnotationConfigEmbeddedWebApplicationContext類,否則實例化DEFAULT_CONTEXT_CLASS所對應的AnnotationConfigApplicationContext類。

7. 將之前準備好的environment配置給當前的ApplicationContext。

8. 將beanNameGenerator、resourceLoader配置給當前的ApplicationContext。

9. 創(chuàng)建好ApplicationContext之后,SpringApplication會通過SpringFactoriesLoader查找classpath中所有可用的ApplicationContextInitializer,遍歷并加載這些ApplicationContextInitializer的initialize(context)方法來對當前的ApplicationContext做進一步的處理。

10. 遍歷執(zhí)行所有SpringApplicationRunListener的contextPrepared()方法。

11. 為BeanDefinitionLoader配置beanNameGenerator、resourceLoader、environment,并加載之前通過@EnableAutoConfiguration獲取的所有配置,以及其余IoC容器配置到當前已準備完畢的ApplicationContext。

12. 遍歷執(zhí)行所有SpringApplicationRunListener的contextLoaded()方法。

13. 調(diào)用ApplicationContext的refresh()方法,完成IoC容器可用的最后工序,并為Runtime.getRuntime()添加ShutdownHook以便在JVM停止時優(yōu)雅退出。

14. 查找當前ApplicationContext中是否注冊ApplicationRunner或CommandLineRunner,如果是,則遍歷執(zhí)行它們。

15. 正常情況下,遍歷執(zhí)行SpringApplicationRunListener的finished()方法。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容