這張圖,??正是理解現代 Spring Boot 自動配置的鑰匙??。它指出的 AutoConfiguration.imports
文件,是 Spring Boot 2.7 之后的新標準,比老式的 spring.factories
更簡潔。咱們就從這個文件開始說。
一、自動配置是啥?為啥需要它?
想象一下,你想用 Spring MVC 寫個 Web 項目,傳統 Spring 你得自己配 DispatcherServlet
、視圖解析器、一堆 XML... 麻煩死了。
Spring Boot 說:“別折騰了,??約定大于配置??!你只要在 pom.xml
里告訴我你要干啥(比如引入 spring-boot-starter-web
),剩下的我來!”
自動配置就是這個“剩下的我來”。它基于你項目里的??依賴??(jar 包)、??配置??(application.properties
)、??代碼??,自動幫你把 Spring 應用需要的 Bean 都配好。
二、自動配置是怎么動起來的?(工作流程)
整個過程就像工廠的自動化流水線:
??第 1 步:啟動信號 - @SpringBootApplication
??
你的主類上的這個注解是個??復合注解??,它封裝了三個核心功能:
@SpringBootConfiguration
: 標志這是配置類。@ComponentScan
: 掃描你寫的@Component
,@Service
等。- ??
@EnableAutoConfiguration
??: 這就是開啟自動配置的??總開關??!最重要!
??第 2 步:大腦與清單 - @EnableAutoConfiguration
和 AutoConfigurationImportSelector
??
@EnableAutoConfiguration
注解導入了 AutoConfigurationImportSelector
這個類。它是??大腦??,負責干重活。
大腦需要一份??裝配清單??,才知道要裝配什么。它就會去你項目的類路徑下找這個清單文件:
- ??老清單?? (
META-INF/spring.factories
):Spring Boot 2.6 及以前用的,寫法啰嗦。 - ??新清單?? (
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
):??就是你圖片里創建的那個文件!?? Spring Boot 2.7+ 推薦使用,一行一個類名,清爽多了。
??大腦的工作就是讀取這份清單上的所有自動配置類。??
??第 3 步:智能篩選 - 條件注解 (@ConditionalOn...
)??
清單上列了上百個自動配置類(比如數據源的、Web 的、安全框架的),難道全給你加載?那不亂套了?
當然不是!每個自動配置類上都有一堆 ??@ConditionalOn...
?? ??條件注解??,這就是流水線的??智能檢測傳感器??。
- ??
@ConditionalOnClass(DataSource.class)
??:傳感器:“檢測到類路徑下有DataSource
這個類嗎?(即你引入了 JDBC 依賴)有?那這個數據源配置類可以生效。” - ??
@ConditionalOnMissingBean
??:傳感器:“檢測一下 Spring 容器里,用戶自己配了DataSource
這個 Bean 嗎?沒配?好,那我來自動配一個。用戶配了?牛逼,用用戶的。” ??這個注解是實現“默認配置”和“用戶覆蓋”的關鍵!?? @ConditionalOnProperty
:傳感器:“檢測配置文件里,有spring.datasource.url
這個屬性嗎?有?好,配置生效。”
只有通過了所有傳感器檢測的配置類,才會被真正加載。
??第 4 步:執行裝配 - 配置類里的 @Bean
??
一個自動配置類本身就是一個 @Configuration
,它內部通過 @Bean
方法,向容器中提供配置好的 Bean。
@Configuration // 這是一個配置類
@ConditionalOnClass(DataSource.class) // 條件:有DataSource類才生效
public class DataSourceAutoConfiguration { // 數據源自動配置類@Bean@ConditionalOnMissingBean // 核心:用戶沒配,我才配!public DataSource dataSource(DataSourceProperties properties) { // 讀取配置屬性// 根據properties里的url, username, password等,創建一個DataSource實例return properties.initializeDataSourceBuilder().build();}
}
三、你圖片的操作:自定義自動配置
你圖片里在 resources
目錄下創建 AutoConfiguration.imports
文件的操作,??意味著你正在參與甚至主導這個自動配置過程!??
??你在做什么???
你是在給你自己的項目(或者你開發的某個 Jar 包)??編寫一份屬于自己的“自動配置清單”??。
??為什么要這么做???
- ??深度定制??:你想對某個功能做非常復雜的配置,但又不想把一大堆
@Bean
寫在主應用里,搞得又亂又長。你就可以把這些配置封裝到一個獨立的MyXxxAutoConfiguration
類中,然后在這個imports
文件里寫上它。項目一啟動,它就會自動生效。 - ??開發自己的 Starter??:這是終極目標!如果你在公司封裝了一套通用組件(比如監控、日志、安全校驗),你希望其他項目只要引入你的依賴,就自動配好一切。那你就是在做一個 ??“自定義 Starter”??。這個
AutoConfiguration.imports
文件就是你 Starter 的“核心清單”,告訴 Spring Boot:“我這個 Jar 包里也有自動配置,啟動時別忘了!”
總結與類比
我們來打個比方,幫你徹底理解:
- ??Spring Boot 應用?? -> 一家??全自動工廠??
- ??
@SpringBootApplication
?? -> 工廠的??總電源開關?? - ??
AutoConfigurationImportSelector
?? -> 工廠的??中央控制系統(大腦)?? - ??
AutoConfiguration.imports
文件?? -> 控制系統的??供應商清單??(你圖片里正在創建的就是這個!) - ??
DataSourceAutoConfiguration
?? -> ??“水源供應商”?? - ??
@ConditionalOnClass(DataSource.class)
?? -> 供應商的合同條款:“如果工廠需要用水,我就開工” - ??
@ConditionalOnMissingBean
?? -> 條款細則:“如果工廠沒有自己的水井,我才提供自來水” - ??最終提供的
DataSource
Bean?? -> 供應商送來的??“水”??
工廠(你的應用)一通電啟動,大腦(控制系統)就照著供應商清單(imports
文件),根據合同條款(條件注解),找來所有合適的供應商(自動配置類),讓他們提供物資(Bean)。于是工廠瞬間就擁有了運轉所需的一切。
這就是 Spring Boot 自動配置,它之所以強大,不是因為它會幫你做一切,而是因為它??聰明地、有選擇地??幫你做掉了那些繁瑣的、通用的配置工作,同時??無比尊重你的決定??,隨時準備被你的自定義配置所覆蓋。