以使用靜態方法 啟動 Springboot 為例,啟動流程主要分為 SpringApplication 的創建和運行兩部分; 創建 1. 設置資源載入器,此處為空 2. 設置 Springboot 啟動類 3. 根據類路徑判斷 web 類型,預設為 SERVLET Spring MVC 4. 讀取每 ...
以使用靜態方法SpringApplication.run(Bootstrap.class, args)
啟動 Springboot 為例,啟動流程主要分為 SpringApplication 的創建和運行兩部分;
創建
- 設置資源載入器,此處為空
- 設置 Springboot 啟動類
- 根據類路徑判斷 web 類型,預設為 SERVLET->Spring MVC
- 讀取每個 jar 包的 /META-INF/spring.factories 文件,獲取 key 為 org.springframework.context.ApplicationContextInitializer 的值,即初始化器
- 讀取每個 jar 包的 /META-INF/spring.factories 文件,獲取 key 為 org.springframework.context.ApplicationListener 的值,即監聽器
- 從當前的運行時堆棧元素中,找到 main 方法所在類
運行
- 啟動計時秒錶
- 讀取每個 jar 包的 /META-INF/spring.factories 文件,獲取 key 為 org.springframework.boot.SpringApplicationRunListener 的值,即 Springboot 的運行監聽器,預設有 EventPublishingRunListener
- 啟動監聽器,使用事件派發器向監聽器派發 ApplicationStartingEvent 事件
- 根據命令行參數 args 初始化 DefaultApplicationArguments
- 獲取環境配置,綁定到 Spring 應用,並派發 ApplicationEnvironmentPreparedEvent 事件
- 配置 spring.beaninfo.ignore 指定的可以忽略的 Bean
- 列印 Banner
- 根據 web 類型創建上下文,預設為 AnnotationConfigServletWebServerApplicationContext
- 讀取每個 jar 包的 /META-INF/spring.factories 文件,獲取 key 為 org.springframework.boot.SpringBootExceptionReporter 的值,即失敗分析器,預設有 FailureAnalyzers
- 準備上下文,即給它配置屬性,回調初始化器,並派發 ApplicationPreparedEvent 事件
- 刷新容器,創建 Bean 的過程,調用 refresh() 方法,見 Spring 源碼總結
- 刷新後的處理,空方法,子類可以實現該方法做額外的處理
- 停止秒錶,列印啟動時長
- 派發 ApplicationStartedEvent 事件
- 調用 ApplicationRunner、CommandLineRunner 的實現方法
- 派發 ApplicationReadyEvent 事件
- 如果啟動過程發生異常,派發 ApplicationFailedEvent 事件,並執行失敗分析器
一些初始化器和監聽器的作用
初始化器
- DelegatingApplicationContextInitializer:獲取環境配置 context.initializer.classes 指定的初始化器。
- ContextIdApplicationContextInitializer:初始化 Spring 應用名 ID:profile:PORT。(spring.application.name:spring.profiles.active:spring.application.name)
- ConfigurationWarningsApplicationContextInitializer:初始化配置檢查,輸出警告日誌。
- ServerPortInfoApplicationContextInitializer:初始化對 WebServerInitializedEvent 事件的監聽,將監聽器添加到派發器
- SharedMetadataReaderFactoryContextInitializer:初始化元數據讀取和緩存的後置處理器 CachingMetadataReaderFactoryPostProcessor。
監聽器
- ConfigFileApplicationListener:載入預設路徑下的配置文件。
- AnsiOutputApplicationListener:監聽 spring.output.ansi.enabled 是否配置了彩色輸出日誌。always:啟用彩色輸出;ever禁用彩色輸出;detect:(預設)自動檢測。
- LoggingApplicationListener:配置日誌系統。
- ClasspathLoggingApplicationListener:列印程式開始啟動和啟動失敗 classpath 的 debug 日誌。
- BackgroundPreinitializer:起一個後臺線程觸發早期的初始化器,包括校驗器、消息轉換器等。(MessageConverterInitializer、MBeanFactoryInitializer、ValidationInitializer、JacksonInitializer、ConversionServiceInitializer)
- DelegatingApplicationListener:獲取環境配置 context.listener.classes 指定的監聽器
- ParentContextCloserApplicationListener:如果父關閉了,則關閉應用程式上下文。它監聽 refresh 事件來獲取上下文,監聽到關閉事件後進行傳播。
- FileEncodingApplicationListener:如果系統文件和環境中配置的編碼不匹配,則停止應用程式。
- ClearCachesApplicationListener:上下文載入後清理緩存。