springboot | 啟動流程

顺丰快递小哥 2024-08-24 04:22 13次浏览 0 条评论 taohigo.com

啟動流程[1]

SpringApplication將一個典型的Spring應用啟動的流程“模板化”

流程步驟

1. 在SpringApplication實例初始化的時候,會完成如下工作:

根據classpath裡面是否存在某個特征類來決定是否應該創建一個為Web應用使用的ApplicationContext類型,還是應該創建一個標準Standalone應用使用的ApplicationContext類型。

使用Spring Factories Loader在應用的classpath中查找並加載所有可用的ApplicationContextInitializer。

使用Spring Factories Loader在應用的classpath中查找並加載所有可用的ApplicationListener。

推斷並設置main方法的定義類。

2. SpringApplication開始執行run方法

首先遍歷執行所有通過SpringFactoriesLoader可以查找到並加載的SpringApplicationRunListener,調用它們的started()方法

3. 創建並配置當前SpringBoot應用將要使用的Environment

4. 遍歷調用所有SpringApplicationRunListener的environmentPrepared()的方法

5. 如果SpringApplication的showBanner屬性被設置為true,則打印banner

6. 根據用戶是否明確設置瞭applicationContextClass類型以及初始化階段的推斷結果,決定該為當前SpringBoot應用創建什麼類型的ApplicationContext並創建完成

然後根據條件決定是否添加ShutdownHook,決定是否使用自定義的BeanNameGenerator,決定是否使用自定義的ResourceLoader

最重要的,將之前準備好的Environment設置給創建好的ApplicationContext使用。

7. ApplicationContext創建好之後,查找並加載classpath中所有可用的ApplicationContextInitializer,然後遍歷調用這些ApplicationContextInitializer的initialize (applicationContext)方法來對已經創建好的ApplicationContext進行進一步的處理

8. 遍歷調用所有SpringApplicationRunListener的contextPrepared()方法

9. 將通過@EnableAutoConfiguration獲取的所有配置以及其他形式的IoC容器配置加載到已經準備完畢的ApplicationContext。

10. 遍歷調用所有SpringApplicationRunListener的contextLoaded()方法

11. 調用ApplicationContext的refresh()方法,完成IoC容器可用的最後一道工序

12. 查找當前ApplicationContext中是否註冊有CommandLineRunner,如果有,則遍歷執行它們。

13. 正常情況下,遍歷執行SpringApplicationRunListener的finished()方法

SpringApplicationRunListener

SpringApplicationRunListener是一個隻有SpringBoot應用的main方法執行過程中接收不同執行時點事件通知的監聽者

public interface SpringApplicationRunListener {
void started();
void environmentPrepared(ConfigurableEnvironment environment);
void contextPrepared(ConfigurableApplicationContext context);
void contextLoaded(ConfigurableApplicationContext context);
void finished(ConfigurableApplicationContext context, Throwable exception);
}