Spring Boot 的啟動流程是一個相對復雜但有序的過程,它涉及多個組件和步驟的協同工作。以下是 Spring Boot 啟動流程的詳細解析:
一、初始化階段
-
啟動入口
- Spring Boot 應用的啟動入口通常是一個包含
main
方法的類,該類上標注了@SpringBootApplication
注解。@SpringBootApplication
是一個組合注解,它包含了@Configuration
、@EnableAutoConfiguration
和@ComponentScan
等核心注解,用于開啟自動配置和組件掃描。
- Spring Boot 應用的啟動入口通常是一個包含
-
創建應用上下文
- 在
main
方法中,通過調用SpringApplication.run()
方法啟動應用。該方法會創建一個SpringApplication
實例,并調用其run()
方法。 SpringApplication
實例在創建過程中會初始化應用上下文(ApplicationContext
),這是 Spring 框架的核心容器,用于管理應用中的所有 Bean。
- 在
二、環境準備階段
-
加載配置文件
- Spring Boot 會自動加載
application.properties
或application.yml
等配置文件,這些文件包含了應用的配置信息,如數據庫連接、服務器端口等。 - 配置文件中的屬性會被綁定到
Environment
對象中,供應用上下文使用。
- Spring Boot 會自動加載
-
確定應用類型
SpringApplication
會根據應用的依賴和配置,確定應用類型(如 Web 應用、非 Web 應用等),并據此初始化相應的應用上下文。
三、組件掃描與自動配置階段
-
組件掃描
@ComponentScan
注解會觸發組件掃描,Spring Boot 會掃描指定包及其子包下的所有類,查找帶有@Component
、@Service
、@Repository
、@Controller
等注解的類,并將它們注冊為 Spring 容器中的 Bean。
-
自動配置
@EnableAutoConfiguration
注解會啟用 Spring Boot 的自動配置機制。Spring Boot 會根據應用的依賴和配置,自動配置應用所需的 Bean 和組件。- 自動配置基于
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中的配置類列表,這些配置類會根據條件(如類路徑中是否存在特定類、配置屬性是否滿足等)決定是否生效。
四、Bean 初始化與依賴注入階段
-
Bean 初始化
- 在應用上下文初始化完成后,Spring Boot 會開始初始化所有的 Bean。這包括調用 Bean 的構造函數、設置屬性等。
- 對于帶有
@PostConstruct
注解的方法,Spring Boot 會在 Bean 初始化完成后調用這些方法,執行一些初始化邏輯。
-
依賴注入
- 在 Bean 初始化過程中,Spring Boot 會根據 Bean 的依賴關系,自動注入所需的依賴。這包括通過構造函數注入、Setter 方法注入或字段注入等方式。
五、應用啟動完成階段
-
啟動監聽器回調
- 在應用啟動完成后,Spring Boot 會調用所有注冊的
ApplicationListener
的onApplicationEvent
方法,通知它們應用已經啟動完成。 - 這可以用于執行一些啟動完成后的邏輯,如發送啟動完成通知、初始化緩存等。
- 在應用啟動完成后,Spring Boot 會調用所有注冊的
-
啟動 Web 服務器(如果是 Web 應用)
- 對于 Web 應用,Spring Boot 會啟動內置的 Web 服務器(如 Tomcat、Jetty 或 Undertow),并監聽指定的端口,等待客戶端請求。
總結
Spring Boot 的啟動流程是一個從初始化到環境準備,再到組件掃描與自動配置,最后到 Bean 初始化與依賴注入,以及應用啟動完成的完整過程。在這個過程中,Spring Boot 充分利用了 Spring 框架的核心特性,如依賴注入、面向切面編程等,同時提供了自動配置、組件掃描等便捷功能,大大簡化了 Spring 應用的開發和部署。