SpringBoot自動(dòng)配置的8個(gè)技巧分享
在 SpringBoot 2.x中,一個(gè)很核心的功能是自動(dòng)配置(Auto-Configuration)機(jī)制,這篇文章,我們來聊一聊 Spring Boot 2.x 實(shí)現(xiàn)自動(dòng)配置的8個(gè)寶藏技巧,希望幫助你更好地掌握SpringBoot的自動(dòng)配置原理。
1. 核心注解:@EnableAutoConfiguration
自動(dòng)配置的啟用主要通過 @EnableAutoConfiguration 注解實(shí)現(xiàn),通常,這個(gè)注解被包含在 @SpringBootApplication 中:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootApplication 等同于組合了以下三個(gè)注解:
@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
2. 自動(dòng)配置類的注冊(cè):spring.factories
Spring Boot 使用 spring.factories 文件(位于各個(gè)自動(dòng)配置模塊的 META-INF 目錄下)來注冊(cè)所有的自動(dòng)配置類。具體來說,@EnableAutoConfiguration 注解會(huì)觸發(fā) AutoConfigurationImportSelector,它會(huì)讀取 spring.factories 文件中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 鍵對(duì)應(yīng)的所有自動(dòng)配置類,并將其導(dǎo)入到應(yīng)用上下文中。
示例 spring.factories 內(nèi)容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.autoconfig.MyAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
3. 條件裝配:@Conditional 注解
自動(dòng)配置類通常使用各種 @Conditional 注解來決定是否應(yīng)用特定的配置。這些條件基于類路徑中的類、存在的 Bean、配置屬性等。常見的條件注解包括:
@ConditionalOnClass: 當(dāng)指定的類存在于類路徑上時(shí)生效。@ConditionalOnMissingBean: 當(dāng)指定的 Bean 不存在時(shí)生效。@ConditionalOnProperty: 當(dāng)特定的配置屬性滿足條件時(shí)生效。@ConditionalOnBean: 當(dāng)指定的 Bean 存在時(shí)生效。
示例:
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
@Bean
public DataSource dataSource() {
// 創(chuàng)建并返回默認(rèn)的數(shù)據(jù)源
}
}
上述配置表示:如果 DataSource 類在類路徑中存在,并且上下文中尚未定義 DataSource Bean,則自動(dòng)配置一個(gè)默認(rèn)的數(shù)據(jù)源。
4. 自動(dòng)配置的優(yōu)先級(jí)與覆蓋
雖然自動(dòng)配置會(huì)根據(jù)條件自動(dòng)配置很多 Bean,但開發(fā)者可以通過以下方式覆蓋默認(rèn)配置:
自定義 Bean:如果開發(fā)者在上下文中定義了某個(gè) Bean,而自動(dòng)配置類又嘗試定義同類型的 Bean,通常開發(fā)者自定義的 Bean 會(huì)優(yōu)先于自動(dòng)配置的 Bean。
排除自動(dòng)配置:可以在 @SpringBootApplication 或 @EnableAutoConfiguration 注解中使用 exclude 屬性來排除特定的自動(dòng)配置類。
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication { ... }
配置屬性:通過在 application.properties 或 application.yml 中設(shè)置特定的配置屬性,可以啟用、禁用或自定義自動(dòng)配置的行為。
5. SpringBoot Starter
Spring Boot Starter 是一組依賴描述符(通常是 Maven 或 Gradle 依賴),它們聚合了一組相關(guān)的依賴項(xiàng)。通過引入特定的 Starter,自動(dòng)配置機(jī)制會(huì)檢測(cè)到相關(guān)的依賴,并根據(jù)需要應(yīng)用相應(yīng)的自動(dòng)配置。
常見的 Starter 示例:
spring-boot-starter-web: 包含了構(gòu)建 Web 應(yīng)用所需的依賴,如spring-webmvc、Tomcat等,并觸發(fā)相關(guān)的自動(dòng)配置(如DispatcherServlet、Tomcat等)。spring-boot-starter-data-jpa: 包含了 JPA 相關(guān)的依賴,并觸發(fā)數(shù)據(jù)源、JPA 實(shí)體管理器等的自動(dòng)配置。
6. AutoConfigurationImportSelector 與組裝自動(dòng)配置
AutoConfigurationImportSelector 是 @EnableAutoConfiguration 背后的關(guān)鍵類。它負(fù)責(zé)讀取 spring.factories 文件中的自動(dòng)配置類,并應(yīng)用到 Spring 應(yīng)用上下文中。流程如下:
- 解析 spring.factories:讀取所有在
spring.factories中注冊(cè)的自動(dòng)配置類。 - 評(píng)估條件:對(duì)于每個(gè)自動(dòng)配置類,評(píng)估其
@Conditional注解,決定是否應(yīng)用該配置。 - 導(dǎo)入配置類:將符合條件的自動(dòng)配置類導(dǎo)入到應(yīng)用上下文中。
7. 調(diào)試與診斷自動(dòng)配置
Spring Boot 提供了一些工具和特性,幫助開發(fā)者理解和調(diào)試自動(dòng)配置:
spring-boot-starter-actuator:包含的 auto-configure 端點(diǎn)可以展示應(yīng)用的自動(dòng)配置報(bào)告。
@EnableAutoConfiguration 的 report 日志:在啟動(dòng)日志中顯示哪些自動(dòng)配置被應(yīng)用或被排除。
spring.autoconfigure.exclude 屬性:可以在配置文件中指定要排除的自動(dòng)配置類。
8. 自定義自動(dòng)配置
作為開發(fā)者,我們也可以創(chuàng)建自定義的自動(dòng)配置類,以便在特定條件下自動(dòng)配置特定的 Bean。
下面列舉了核心的 3個(gè)步驟:
創(chuàng)建自動(dòng)配置類:使用 @Configuration 和適當(dāng)?shù)?@Conditional 注解。
@Configuration
@ConditionalOnClass(MyService.class)
public class MyServiceAutoConfiguration {
@Bean
public MyService myService() {
return new MyService();
}
}
在 spring.factories 中注冊(cè):
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.autoconfig.MyServiceAutoConfiguration
發(fā)布 Starter:將自動(dòng)配置類打包在一個(gè) Starter 中,供其他項(xiàng)目引入使用。
通過上面 3個(gè)核心步驟,當(dāng)我們?cè)趩?dòng)SpringBoot容器時(shí),自定義的類就會(huì)被自動(dòng)配置,實(shí)現(xiàn)我們要達(dá)到的預(yù)期。
9. 總結(jié)
本文,我們分析了 Spring Boot 2.x 自動(dòng)配置的 8個(gè)寶藏技巧,通過一系列智能的條件判斷、依賴管理和配置文件支持,Spring能夠根據(jù)項(xiàng)目的實(shí)際需求自動(dòng)裝配所需的組件和 Bean。這極大地簡(jiǎn)化了 Spring 應(yīng)用的配置過程,使得開發(fā)者能夠更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而無需關(guān)心繁瑣的配置細(xì)節(jié)。
到此這篇關(guān)于SpringBoot自動(dòng)配置的8個(gè)技巧分享的文章就介紹到這了,更多相關(guān)SpringBoot自動(dòng)配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java的stream流多個(gè)字段排序的實(shí)現(xiàn)
本文主要介紹了Java的stream流多個(gè)字段排序的實(shí)現(xiàn),主要是兩種方法,第一種是固定多個(gè)字段排序和第二種動(dòng)態(tài)字段進(jìn)行排序,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
SpringBoot實(shí)現(xiàn)分布式驗(yàn)證碼登錄方案小結(jié)
驗(yàn)證碼登錄作為一種有效的防護(hù)手段,可以防止惡意gongji、暴力pojie等,本文主要介紹了SpringBoot實(shí)現(xiàn)分布式驗(yàn)證碼登錄方案小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12
Java語(yǔ)言獲取TCP流的實(shí)現(xiàn)步驟
使用Wireshark分析網(wǎng)絡(luò)包時(shí),一個(gè)很常用的功能就是選中一個(gè)TCP報(bào)文,然后查看這個(gè)TCP報(bào)文的TCP流,從而可以進(jìn)一步分析建連是否慢了,斷連是否正常等情況,那么本文就TCP流的概念以及在Java中如何獲取,做一個(gè)簡(jiǎn)單的學(xué)習(xí),需要的朋友可以參考下2023-11-11
Java版數(shù)據(jù)結(jié)構(gòu)插入數(shù)據(jù)時(shí)遇到的結(jié)點(diǎn)為空的問題詳解
這篇文章主要介紹了Java版數(shù)據(jù)結(jié)構(gòu)插入數(shù)據(jù)時(shí)遇到的結(jié)點(diǎn)為空的問題及解決辦法,需要的朋友們可以學(xué)習(xí)下。2019-09-09
Jackson處理Optional時(shí)遇到問題的解決與分析
Optional是Java實(shí)現(xiàn)函數(shù)式編程的強(qiáng)勁一步,并且?guī)椭诜妒街袑?shí)現(xiàn),但是Optional的意義顯然不止于此,下面這篇文章主要給大家介紹了關(guān)于Jackson處理Optional時(shí)遇到問題的解決與分析的相關(guān)資料,需要的朋友可以參考下2022-02-02
Java實(shí)現(xiàn)跳躍表(skiplist)的簡(jiǎn)單實(shí)例
這篇文章主要介紹了Java編程中跳躍表的概念和實(shí)現(xiàn)原理,并簡(jiǎn)要敘述了它的結(jié)構(gòu),具有一定參考價(jià)值,需要的朋友可以了解下。2017-09-09
SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理
在我們開發(fā)SpringBoot后端服務(wù)時(shí),一般需要給前端統(tǒng)一響應(yīng)格式,本文主要介紹了SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理2023-05-05
Mybatis空值關(guān)聯(lián)的問題解析及解決方案
這篇文章給大家介紹了Mybatis空值關(guān)聯(lián)的問題解析及解決方案,文中通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01

