Spring Boot 自動配置原理的使用小結(jié)
先按 Spring Boot 3.x 的主流實(shí)現(xiàn)來講,并對比一下早期版本的差異。
Spring Boot 自動配置的核心,可以概括成一句話:
Spring Boot 會在啟動時,根據(jù)類路徑里的依賴、當(dāng)前環(huán)境、配置文件以及容器里是否已經(jīng)存在某些 Bean,動態(tài)決定要不要加載某些默認(rèn)配置類,從而自動幫你創(chuàng)建 Bean。
你可以按下面這套邏輯來理解和面試回答。
一、什么是自動配置
Spring Boot 的自動配置,意思是:
你只要引入了某些 starter 或 jar 包,Spring Boot 就會嘗試“按約定”幫你把常用 Bean 配好。
例如類路徑里有數(shù)據(jù)庫相關(guān)依賴,而且你自己沒有手動定義 DataSource,它就會自動配置數(shù)據(jù)源;如果你自己定義了同名或同類型 Bean,自動配置通常會“退讓”。
所以它不是“無腦幫你全配”,而是:
- 有條件地生效
- 默認(rèn)配置
- 用戶配置優(yōu)先
二、自動配置從哪里開始
自動配置的入口,通常是啟動類上的:
- @SpringBootApplication
- 或 @EnableAutoConfiguration
@SpringBootApplication 本身就包含了 @EnableAutoConfiguration,所以大多數(shù)項(xiàng)目其實(shí)都是通過 @SpringBootApplication 開啟自動配置的。官方文檔也明確說明,自動配置需要通過這兩個注解之一顯式啟用。
三、自動配置的本質(zhì)是什么
自動配置的本質(zhì)其實(shí)不是魔法,它底層依然是 Spring 的 @Configuration 配置類機(jī)制。
也就是說,Spring Boot 所謂的“自動配置類”,本質(zhì)上就是一批普通的配置類,只不過這些配置類上加了很多條件注解,例如:
- @ConditionalOnClass
- @ConditionalOnMissingBean
- 以及其他 @Conditional... 注解
官方文檔明確指出,自動配置類是標(biāo)準(zhǔn)的配置類,靠額外的條件注解來約束什么時候生效;其中最常見的就是“類路徑里有某個類才生效”和“容器里沒有用戶自定義 Bean 才生效”。
所以你可以理解為:
自動配置 = 配置類 + 條件判斷。
四、Spring Boot 怎么找到這些自動配置類
這部分是面試最愛問的。
1. Spring Boot 3.x / 4.x 主流機(jī)制
當(dāng)前官方文檔說明,Spring Boot 會在 jar 包中查找:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
這個文件里按行列出所有自動配置類,Spring Boot 啟動時會把這些類加載進(jìn)來作為候選自動配置類。
2. 早期 Spring Boot 2.x 常見機(jī)制
較早版本里,自動配置類通常是通過:
META-INF/spring.factories
在 EnableAutoConfiguration 鍵下進(jìn)行聲明。官方 2.0 文檔就是這樣描述的。
所以面試?yán)镒詈眠@樣答:
早期版本主要通過 spring.factories 加載自動配置類,Spring Boot 3.x 以后主流是通過 AutoConfiguration.imports 文件加載。
五、自動配置為什么能“按需生效”
因?yàn)槊總€自動配置類上通常都會加條件注解,只有條件滿足才會生效。
最常見的幾個條件是:
1.@ConditionalOnClass
只有當(dāng)類路徑里存在某個類時,自動配置才生效。
比如引入了 DispatcherServlet、DataSource、RedisTemplate 等相關(guān)類,對應(yīng)配置才有機(jī)會加載。
2.@ConditionalOnMissingBean
只有當(dāng) Spring 容器里沒有某個 Bean 時,才創(chuàng)建默認(rèn) Bean。
這保證了“用戶自定義優(yōu)先于自動配置”。
3. 其他條件
還常見基于配置項(xiàng)、環(huán)境、Web 應(yīng)用類型等條件的注解。
本質(zhì)都是在啟動階段做一輪“匹配判斷”,匹配成功才注冊 Bean。
六、自動配置的大致執(zhí)行流程
你可以把它理解成下面 5 步:
- 啟動類上的 @SpringBootApplication 開啟自動配置。
- Spring Boot 去讀取自動配置候選文件,找到一批自動配置類;3.x 主要讀 AutoConfiguration.imports,早期 2.x 常見是 spring.factories。
- 把這些自動配置類當(dāng)作普通 @Configuration 類導(dǎo)入容器。
- 逐個判斷這些配置類上的條件注解是否成立,比如類在不在、配置有沒有、Bean 是否缺失。
- 條件滿足的配置類生效,里面的 @Bean 被注冊到 Spring 容器中;條件不滿足的則跳過。用戶自己定義的 Bean 通常會讓自動配置“退讓”。
七、為什么說“約定大于配置”
因?yàn)?Spring Boot 提前把很多常見場景的配置規(guī)則寫好了:
- 你引入什么依賴
- 環(huán)境里有什么類
- 你有沒有手動聲明 Bean
- 配置文件有沒有開啟或關(guān)閉某功能
它會根據(jù)這些約定自動給你配默認(rèn)值。
你不需要從零開始寫大量 XML 或 Java 配置,這就是“約定大于配置”的體現(xiàn)。官方也強(qiáng)調(diào),自動配置是基于你添加到類路徑中的 jar 依賴來“嘗試自動配置”應(yīng)用。
八、自動配置和用戶配置沖突時怎么辦
Spring Boot 的設(shè)計(jì)原則是:
自動配置是補(bǔ)位,不是強(qiáng)覆蓋。
如果你自己定義了配置,比如自己寫了一個 DataSource Bean,那么默認(rèn)的數(shù)據(jù)源自動配置通常會退讓,不再重復(fù)創(chuàng)建。官方文檔明確給出了這種“用戶自定義后自動配置 backs away”的行為。
九、面試回答
Spring Boot 自動配置的原理,本質(zhì)上是啟動時通過 @EnableAutoConfiguration 導(dǎo)入一批自動配置類,這些自動配置類本質(zhì)上都是普通的 @Configuration 配置類。Spring Boot 會從候選文件中加載這些自動配置類,早期 2.x 常見是 META-INF/spring.factories,3.x 以后主流是 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。加載后,再結(jié)合 @ConditionalOnClass、@ConditionalOnMissingBean 等條件注解進(jìn)行判斷,只有在類路徑、配置環(huán)境、Bean 狀態(tài)等條件滿足時,才會把對應(yīng) Bean 注冊到容器中。如果用戶已經(jīng)自己定義了 Bean,自動配置通常會退讓。因此自動配置的核心就是:候選配置類加載 + 條件裝配 + 用戶配置優(yōu)先。
十、一句話總結(jié)
Spring Boot 自動配置就是:啟動時加載一批預(yù)定義的配置類,再根據(jù)類路徑、配置項(xiàng)和容器現(xiàn)狀做條件判斷,滿足條件就自動注冊 Bean,不滿足就跳過,且用戶自定義配置優(yōu)先。
到此這篇關(guān)于Spring Boot 自動配置原理的使用小結(jié)的文章就介紹到這了,更多相關(guān)Spring Boot 自動配置原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot多模塊項(xiàng)目中優(yōu)雅實(shí)現(xiàn)自動配置的完整指南
- spring?boot3自動配置與手動配置的全過程
- Spring Boot 自動配置的底層實(shí)現(xiàn)原理深度解析
- 一文徹底弄懂Spring?Boot自動配置
- Spring Boot 自動配置原理實(shí)現(xiàn)機(jī)制深度解析(實(shí)戰(zhàn)示例)
- SpringBoot啟動過程與自動配置過程解讀
- SpringBoot實(shí)現(xiàn)自動配置全過程
- 一文詳解SpringBoot如何創(chuàng)建自定義的自動配置
- SpringBean管理與Spring Boot自動配置原理解析
- SpringBoot實(shí)現(xiàn)自動配置的方式詳解
相關(guān)文章
解析ConcurrentHashMap: 預(yù)熱(內(nèi)部一些小方法分析)
ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見問題---ConcurrentHashMap知識,一起看看吧2021-06-06
Java class文件格式之特殊字符串_動力節(jié)點(diǎn)Java學(xué)院整理
特殊字符串出現(xiàn)在class文件中的常量池中,本著循序漸進(jìn)和減少跨度的原則, 首先把class文件中的特殊字符串做一個詳細(xì)的介紹, 然后再回過頭來繼續(xù)講解常量池,對java class 文件格式相關(guān)知識感興趣的的朋友一起學(xué)習(xí)吧2017-06-06
SpringBoot常用注解,thymeleaf,數(shù)據(jù)提交的實(shí)現(xiàn)
SpringBoot簡化了微服務(wù)配置,提供快速啟動和內(nèi)嵌容器化web項(xiàng)目,常用注解包括@Component、@RestController等,Thymeleaf為前端頁面渲染提供支持,數(shù)據(jù)提交時需使用@RequestBody注解2026-01-01
Java項(xiàng)目全面升級轉(zhuǎn)化經(jīng)驗(yàn)(涉及JDK、Spring?boot版本及依賴管理架構(gòu))
在軟件開發(fā)領(lǐng)域,項(xiàng)目升級是一個必然的過程,隨著技術(shù)的不斷進(jìn)步和業(yè)務(wù)需求的變化,對于舊項(xiàng)目的升級和優(yōu)化已成為許多企業(yè)必須面對的問題,這篇文章主要介紹了Java項(xiàng)目全面升級轉(zhuǎn)化的相關(guān)資料,包括JDK、Spring?boot版本及依賴管理架構(gòu),需要的朋友可以參考下2025-09-09
Java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中重復(fù)的結(jié)點(diǎn)
在一個排序的鏈表中,會存在重復(fù)的結(jié)點(diǎn),如何實(shí)現(xiàn)刪除該鏈表中重復(fù)的結(jié)點(diǎn),重復(fù)的結(jié)點(diǎn)不保留,并返回鏈表頭指針呢?接下來小編將帶你詳細(xì)介紹2021-12-12
Java實(shí)現(xiàn)商品管理系統(tǒng)代碼實(shí)例講解
這篇文章主要介紹了Java實(shí)現(xiàn)商品管理系統(tǒng)代碼實(shí)例講解,文中代碼實(shí)例講解的很清楚,有需要的同學(xué)可以借鑒參考下2021-02-02
SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決
這篇文章主要介紹了SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

