Meta CEO 扎克伯格:俄烏戰爭大規模破壞世界穩定
一、SpringBoot啟動過程
1. 建立SpringApplication
(1) 儲存一些資訊。
(2) 判定當前應用的型別。ClassUtils。Servlet
(3) 找bootstrappers;初始啟動引導器(List<Bootstrapper>),getSpringFactoriesInstances()去META-INF/spring.factories檔案中找Bootstrapper
(4) 找ApplicationContextInitializer;初始化器;getSpringFactoriesInstances()去META-INF/spring.factories
List<ApplicationContextInitializer<?>> initializers
(5) 找ApplicationListener;應用監聽器;getSpringFactoriesInstances()去META-INF/spring.factories檔案中找ApplicationListener
(6) 找到主程式
2. 執行SpringApplication
(1) StopWatch
記錄應用的啟動時間
(2) 建立引導上下文(Context環境)createBootstrapContext()
- 獲取所有之前 bootstrappers 挨個執行 intitialize() 來完成對引導啟動器上下文環境設定
public interface Bootstrapper { /** * Initialize the given {@link BootstrapRegistry} with any required registrations. * @param registry the registry to initialize */ void intitialize(BootstrapRegistry registry); }
(3) 讓當前應用進入headless
(4) 獲取所有RunListener(執行監聽器)【為了方便所有 Listener進行事件感知】
- getSpringFactoriesInstances() 去META-INF/spring.factories檔案中找SpringApplicationRunListener
(5) 遍歷 SpringApplicationRunListener 呼叫 starting 方法;
- 相當於通知所有感興趣系統正在啟動過程的人,專案正在starting.
(6) 儲存命令列引數: ApplicationArguments
(7) 準備環境 prepareEnvironment()
- 返回或建立一個基礎環境資訊物件 StandardServletEnvironment
-
配置環境資訊物件。
- 讀取所有的配置源的配置屬性值
- 繫結環境資訊
- 監聽器呼叫 listener.environmentPrepared();通知所有的監聽器當前環境準備完成
(8) 建立IOC容器 createApplicationContext()
- 根據專案型別(Servlet)建立容器
- 當前會建立 AnnotationConfigServletWebServerApplicationContext
(9) 準備ApplicationContext IOC容器的基本資訊 prepareContext()
- 儲存環境資訊
- IOC容器的後置處理流程
- 應用初始化器, applyInitializers
- 遍歷所有的ApplicationContextInitializer,呼叫initialize() 來對ioc容器進行初始化擴充套件功能。
-
- 遍歷所有的 listener呼叫contextPrepared()。EvenpublishRunListener 通知所有的監聽器contextPrepared
- 通知所有的監聽器,呼叫 contextLoaded,通知所有監聽器 contextLoaded;
(10) 重新整理 IOC容器 refreshContext
- 建立容器中的所有元件(需要補充學習)
(11) 容器重新整理完成後工作 afterRefresh
(12) 所有監聽器呼叫 listeners.started(context); 通知所有的監聽器started
(13) 呼叫所有的runners callRunners()
- 獲取容器中的ApplicationRunner
- 獲取容器中的CommandLineRunner
- 獲取所有runner並且按照@Order進行排序
- 遍歷所有的runner,呼叫run方法
-
如果以上有異常
- 呼叫Listener的falid
(14) 呼叫所有監聽器的running方法 listeners.running(context); 通知所有的監聽器running
- running如果有問題,繼續通知faild,呼叫所有Listener的faile, 通知所有的監聽器faild