1. 程式人生 > 資訊 >Meta CEO 扎克伯格:俄烏戰爭大規模破壞世界穩定

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

檔案中找ApplicationContextInitializer

      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

模式,java.awt.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