重學SpringBoot3-自動配置機制
- 引言
- Spring Boot 自動配置原理
- 示例:Spring Boot Web 自動配置
- 深入理解
- 總結
- 相關閱讀
引言
Spring Boot 的自動配置是其最強大的特性之一,它允許開發者通過最少的配置實現應用程序的快速開發和部署。這一切都得益于 Spring Boot 的 “約定優于配置” 的設計理念。本教程將帶你了解 Spring Boot 自動配置的背后原理,并通過示例解釋其工作方式。
Spring Boot 自動配置原理
Spring Boot
自動配置的核心是一系列自動配置類,這些類通常基于類路徑中的存在和屬性值來條件性地配置應用程序。
主要步驟如下:
-
啟動類:每個
Spring Boot
應用都有一個啟動類,通常使用@SpringBootApplication
注解。這個注解是一個組合的注解,它包含了@EnableAutoConfiguration
,后者是自動配置的關鍵。 -
@EnableAutoConfiguration:這個注解告訴
Spring Boot
開始掃描候選自動配置類,并應用它們。這些候選自動配置類通常通過spring.factories
文件存放,該文件位于自動配置模塊的META-INF/
目錄下。 -
條件注解:自動配置類使用條件注解(如
@ConditionalOnClass
、@ConditionalOnBean
、@ConditionalOnProperty
等)來確保只有在特定條件滿足時才應用配置。例如,某個自動配置類可能只在某個類存在于類路徑上時才激活。 -
屬性綁定:自動配置過程還涉及將外部配置(如
application.properties
或application.yml
)綁定到配置類上,進一步定制化自動配置。
相關源碼:
從啟動類開始
@SpringBootApplication
注解其實包含三個注解,自動配置相關的是@EnableAutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration
:通過@Import
導入自動配置模塊的導入選擇器AutoConfigurationImportSelector,它的作用是在啟動時掃描指定包路徑下的所有自動配置類,并根據應用程序的依賴關系和環境變量等信息,自動地選擇需要引入的自動配置類,并將其注冊為Bean
,以便應用程序可以正常使用這些自動配置的功能。
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports
:該方法的主要作用是從給定的注解元數據中篩選出需要導入的包名。
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry
:用于獲取自動配置項的入口點。該方法接受一個參數,即要獲取的自動配置項的名稱。它返回一個AutoConfigurationEntry
對象,該對象包含了自動配置項的詳細信息,如類路徑、Bean
定義等。重點看該方法內調用的getCandidateConfigurations()
方法。
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations
:這個方法的作用是獲取候選的自動配置類列表。
org.springframework.boot.context.annotation.ImportCandidates#load
:通過調用ImportCandidates.load()
方法,從META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中加載候選的自動配置類,并將其存儲在configurations
變量中。
org.springframework.boot.autoconfigure.AutoConfiguration.imports
:存放了SpringBoot
自動配置類,不同SpringBoot
版本數量不同。
回到org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry
,會對讀到所有的自動配置類進行篩選。
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.ConfigurationClassFilter#filter
:篩選條件就是使用條件注解(如@ConditionalOnClass
、@ConditionalOnBean
、@ConditionalOnProperty
等)來確保只有在特定條件滿足時才應用配置。
例如符合篩選條件的
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
自動配置類,類上帶有@EnableConfigurationProperties({ServerProperties.class})
,既將配置文件(如application.properties
或application.yml
)中的屬性綁定到帶有@ConfigurationProperties
注解的類ServerProperties.class
對象上,從而達到引入starter
配置少量參數就能運行的目的。
示例:Spring Boot Web 自動配置
假設你想創建一個簡單的 Spring Boot Web 應用。你只需要做以下幾步:
-
添加依賴:在
pom.xml
或build.gradle
文件中添加Spring Boot Starter Web
依賴。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>
-
創建啟動類:
@SpringBootApplication public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);} }
-
編寫控制器:
@RestController public class HelloController {@GetMapping("/")public String hello() {return "Hello, Spring Boot!";} }
-
配置文件
server.port=8808
在這個例子中,spring-boot-starter-web
包含了 Spring MVC
和 Tomcat
作為默認的嵌入式服務器,以及其他 Web
開發所需的依賴。當你啟動應用時,Spring Boot
的自動配置會檢測到類路徑上的 spring-webmvc
和嵌入式 Tomcat
,并自動配置它們。這意味著你通過少量的配置或默認配置就可以運行一個基本的 Web 應用。
深入理解
-
自定義自動配置:如果默認的自動配置不符合你的需求,你可以通過添加自定義配置來覆蓋或補充默認配置。此外,你也可以通過排除特定的自動配置類來禁用它們。
-
條件化配置:理解自動配置背后的條件邏輯對于高效使用
Spring Boot
非常重要。你可以查看特定自動配置類的源碼,以了解它們是如何根據應用的狀態和外部配置做出決策的。
總結
Spring Boot
的自動配置極大簡化了 Spring
應用的配置工作,讓開發者可以專注于應用邏輯的實現,而非繁瑣的配置。通過合理利用自動配置和條件注解,你可以快速地構建出既強大又靈活的 Spring
應用。了解并掌握 Spring Boot
自動配置的原理和使用方法,將有助于你更高效地開發 Spring Boot
應用。
相關閱讀
重學SpringBoot3-@Import注解的作用
重學SpringBoot3-@ConditionalOnXxx條件注解
重學SpringBoot3-@ConditionalOnXxx條件注解
重學SpringBoot3-@EnableConfigurationProperties注解