啟動流程[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);
}
-
扫码下载安卓APP
-
微信扫一扫关注我们微信扫一扫打开小程序手Q扫一扫打开小程序
-
返回顶部