springboot的啟動流程
一文徹底弄懂Spring Boot的啟動過程
一,Spring Boot啟動過程
1. 啟動入口
Spring Boot 應用的啟動入口通常是一個包含 @SpringBootApplication 注解的主類,并調用 SpringApplication.run() 方法。@SpringBootApplication 是一個復合注解,包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan,從而開啟了自動配置和組件掃描。
源碼路徑在 SpringApplication 類的 run() 方法:
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) { return new SpringApplication(primarySource).run(args); }
這個入口主要做了以下幾件事情:
- 創建 SpringApplication 實例:初始化 Spring Boot 環境。
- 初始化環境和監聽器:設置啟動的
Environment,并且添加ApplicationListener監聽器。 - 準備和刷新 Spring 上下文:通過
prepareContext和refreshContext方法進行上下文環境的準備和刷新。
2. 創建 SpringApplication 實例
在 SpringApplication 的構造方法中,Spring Boot 解析應用的啟動模式(例如是 Web 應用、Servlet 應用或是普通應用),并初始化應用的上下文類型。Spring Boot 的不同上下文類型包括 AnnotationConfigApplicationContext(非 Web 應用)和 AnnotationConfigServletWebServerApplicationContext(Web 應用)。
3. 初始化 Environment 和監聽器
接下來,Spring Boot 會初始化 ConfigurableEnvironment,這個環境中包含了系統的屬性、環境變量、配置文件等數據,作為后續加載 Bean 定義和初始化的基礎。
同時,Spring Boot 也會初始化一系列的 ApplicationListener,用于監聽和處理應用啟動過程中的事件,比如 ApplicationEnvironmentPreparedEvent、ApplicationPreparedEvent 等。
4. 加載配置類并觸發自動配置
Spring Boot 使用 @EnableAutoConfiguration 注解觸發自動配置,核心實現是在 AutoConfigurationImportSelector 中加載 META-INF/spring.factories 配置文件,文件中列出了許多自動配置類(如 DataSourceAutoConfiguration、JpaRepositoriesAutoConfiguration 等),根據條件(例如某些 Bean 是否存在、某些屬性是否被配置等)加載相應的自動配置。
5. 加載并注冊 Bean
在 refreshContext() 方法中,Spring Boot 調用 refresh() 方法,這一步驟中完成了 BeanFactory 的初始化和 BeanPostProcessor 的注冊,并解析 @Component、@Service、@Repository 等注解標注的 Bean 定義,將它們注冊到 BeanFactory 中。
在源碼層面,refresh() 方法中,invokeBeanFactoryPostProcessors 和 registerBeanPostProcessors 這兩個方法是關鍵,分別用于執行所有 BeanFactoryPostProcessor 和 BeanPostProcessor,確保 Bean 的生命周期正確管理。
6. Web 環境中的嵌入式容器啟動
在 Web 應用中,Spring Boot 會啟動嵌入式 Web 容器(如 Tomcat 或 Jetty)。Spring Boot 默認通過 ServletWebServerApplicationContext 啟動內嵌的 Web 服務器。在 refresh() 的最后,會啟動嵌入式容器,將應用作為 Web 應用發布。
7. 執行 ApplicationRunner 和 CommandLineRunner
Spring Boot 啟動完成后,會掃描并執行所有實現了 ApplicationRunner 和 CommandLineRunner 接口的 Bean。它們可以用于在啟動后執行自定義邏輯。
8. 發布應用啟動完成事件
最后,Spring Boot 發布 ApplicationReadyEvent 事件,通知所有監聽器應用已啟動完成。至此,Spring Boot 應用正式啟動完成,可以接收 HTTP 請求或執行其他任務。
二、Spring Boot 啟動過程的架構設計
在 Spring Boot 應用啟動的過程中,SpringApplication.run() 是最常用的啟動方式。通過這個方法,Spring Boot 為開發者屏蔽了大量復雜的初始化細節,我們只需提供主啟動類的入口和簡單的配置信息即可啟動整個應用。
下面我們從源碼入手,分步驟分析 SpringApplication.run 進行的操作。
1,SpringApplication.run() 的詳細流程
SpringApplication.run 主要完成以下幾大步驟:
-
初始化 SpringApplication 實例:
該實例負責整個 Spring Boot 應用的啟動過程,通過判斷應用類型和設置環境變量為后續配置加載和應用上下文創建提供基礎。核心方法為
SpringApplication#prepareEnvironment和SpringApplication#createApplicationContext。 -
創建應用上下文并刷新上下文:
SpringApplication將根據應用類型來創建不同的ApplicationContext(如AnnotationConfigApplicationContext或ServletWebServerApplicationContext),并將所有Bean裝載到上下文中。 -
加載環境配置:
Spring Boot 會基于開發環境或生產環境加載不同的配置文件。核心是
ConfigFileApplicationListener監聽配置事件,解析應用配置文件(application.properties或application.yml)并裝配到應用上下文的Environment對象中。 -
啟動嵌入式容器:
如果是 Web 應用,Spring Boot 會啟動內嵌的服務器(如 Tomcat、Jetty 或 Undertow),并將
DispatcherServlet注冊到服務器中。
http://www.rzrgm.cn/lgx211/p/18535984

浙公網安備 33010602011771號