目錄
1. 啟動入口
2. SpringApplication 初始化
3. 準備環境
4. 創建應用上下文(ApplicationContext)
5. 準備應用上下文
6. 刷新應用上下文
7. 啟動 Web 服務器(若為 Web 應用)
8. 發布 ApplicationStartedEvent 事件
9. 執行 Runner
10. 發布 ApplicationReadyEvent 事件
1. 啟動入口
Spring Boot 應用的啟動從 main
方法開始,main
方法通常位于一個帶有 @SpringBootApplication
注解的類中。@SpringBootApplication
是一個組合注解,它包含了 @Configuration
(標識該類為配置類,可定義 Bean 等配置)、@EnableAutoConfiguration
(開啟自動配置功能,依據項目依賴自動配置相關組件)和 @ComponentScan
(用于掃描指定包及其子包下的組件,如 @Component
、@Service
、@Repository
、@Controller
等注解標注的類)。示例代碼如下:
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
2. SpringApplication 初始化
SpringApplication.run()
方法會創建一個 SpringApplication
實例,并調用其 run
方法。該實例的初始化過程包含以下關鍵步驟:
- 推斷應用類型:依據類路徑上的依賴來判斷應用類型,比如包含
spring-boot-starter-web
依賴則推斷為 Servlet 應用,若包含相關響應式編程依賴則推斷為 Reactive 應用等。 - 設置初始化器(Initializers):通過
SpringFactoriesLoader
從META-INF/spring.factories
文件中加載并應用ApplicationContextInitializer
。這些初始化器可在應用上下文創建前對其進行定制化配置,例如設置屬性源等。 - 設置監聽器(Listeners):同樣借助
SpringFactoriesLoader
加載并應用ApplicationListener
,用于監聽應用啟動過程中的各類事件,如環境準備完成事件、應用上下文初始化事件等,以便在不同階段執行相應邏輯。 - 推斷主應用類:通過堆棧跟蹤的方式推斷出主應用類,即包含
main
方法且帶有@SpringBootApplication
注解的類。
3. 準備環境
在 run
方法中,Spring Boot 會進行應用環境(Environment
)的準備工作,具