Spring @ConditionalOnMissingBean 注解的主要作用解析
@ConditionalOnMissingBean 是 Spring Boot 自動(dòng)配置中一個(gè)非常常用的條件化注解,它的核心作用是:只有當(dāng)指定的 Bean 在 Spring 容器中不存在時(shí),才創(chuàng)建被標(biāo)注的 Bean 或配置類。
主要作用
1.提供默認(rèn)配置
Spring Boot 的自動(dòng)配置大量使用該注解,為常見組件提供默認(rèn)實(shí)現(xiàn)。
@Configuration
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean // 只有在用戶沒有定義自己的 DataSource 時(shí),才創(chuàng)建這個(gè)默認(rèn)的
public DataSource dataSource() {
return new HikariDataSource();
}
}2.允許用戶自定義 Bean 覆蓋默認(rèn)配置
用戶可以定義自己的 Bean 來(lái)覆蓋 Spring Boot 的默認(rèn)實(shí)現(xiàn)。
@Configuration
public class MyCustomConfig {
@Bean
public DataSource dataSource() {
// 用戶自定義的 DataSource
return new MyCustomDataSource();
// 由于這個(gè) Bean 存在,上面的自動(dòng)配置的 DataSource 就不會(huì)被創(chuàng)建
}
}常見用法
1.指定 Bean 類型
@Bean
@ConditionalOnMissingBean
public MyService myService() {
return new DefaultMyService();
}
2.指定具體的 Bean 名稱
@Bean
@ConditionalOnMissingBean(name = "customBean")
public MyService myService() {
return new DefaultMyService();
}
3.指定多個(gè) Bean 類型
@Bean
@ConditionalOnMissingBean({DataSource.class, XADataSource.class})
public DataSource dataSource() {
return new EmbeddedDataSource();
}
實(shí)際應(yīng)用場(chǎng)景
場(chǎng)景1:數(shù)據(jù)庫(kù)配置
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.datasource", name = "type")
public DataSource dataSource(DataSourceProperties properties) {
// 創(chuàng)建默認(rèn)數(shù)據(jù)源
}
}場(chǎng)景2:緩存配置
@Configuration
@ConditionalOnClass(CacheManager.class)
public class CacheAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public CacheManager cacheManager() {
// 提供默認(rèn)的緩存管理器
}
}與其他條件注解配合使用
@Configuration
@ConditionalOnClass(MyService.class) // 類路徑存在時(shí)才生效
@ConditionalOnProperty(prefix = "app", name = "enabled", havingValue = "true") // 屬性條件
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean // 用戶沒有自定義時(shí)才生效
public MyService myService() {
return new DefaultMyService();
}
}注意事項(xiàng)
- 加載順序問題:Bean 的創(chuàng)建順序會(huì)影響
@ConditionalOnMissingBean的判斷結(jié)果 - 多個(gè)配置類:如果有多個(gè)配置類都定義了相同的 Bean,Spring 需要確定哪個(gè)配置類先加載
- 配合
@Primary使用:當(dāng)有多個(gè)同類型 Bean 時(shí),可以指定哪個(gè)是主要的
@Bean
@ConditionalOnMissingBean
@Primary // 當(dāng)有多個(gè) DataSource 時(shí),這個(gè)作為主要的
public DataSource primaryDataSource() {
return new PrimaryDataSource();
}
總結(jié)
@ConditionalOnMissingBean 是 Spring Boot “約定優(yōu)于配置” 理念的重要實(shí)現(xiàn):
- ? 提供開箱即用的默認(rèn)配置
- ? 允許用戶輕松自定義和覆蓋
- ? 避免 Bean 定義的沖突
- ? 是 Spring Boot 自動(dòng)配置靈活性的關(guān)鍵
這種機(jī)制使得 Spring Boot 既能提供強(qiáng)大的默認(rèn)配置,又保持了高度的可定制性。
到此這篇關(guān)于Spring @ConditionalOnMissingBean 注解是做什么的的文章就介紹到這了,更多相關(guān)Spring @ConditionalOnMissingBean 注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java序列化和serialVersionUID的使用方法實(shí)例
這篇文章主要介紹了java序列化和serialVersionUID的使用方法實(shí)例的相關(guān)資料,這里說(shuō)明很詳細(xì)的使用方法讓你徹底學(xué)會(huì),需要的朋友可以參考下2017-08-08
SpringBoot整合緩存方式(Caffeine、Redis)
SpringBoot整合緩存注解包括@EnableCaching、@Cachable、@CachePut和@CacheEvict,分別用于配置緩存管理器和標(biāo)記緩存操作,文章詳細(xì)介紹了整合Caffeine和Redis緩存的步驟,并展示了配置類與控制層代碼,優(yōu)點(diǎn)是快速應(yīng)用緩存,缺點(diǎn)是無(wú)法精細(xì)處理緩存2026-05-05
java實(shí)現(xiàn)隨機(jī)數(shù)生成器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)隨機(jī)數(shù)生成器,隨機(jī)數(shù)生成小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
k8s部署的java服務(wù)添加idea調(diào)試參數(shù)的方法
文章介紹了如何在K8S容器中的Java服務(wù)上進(jìn)行遠(yuǎn)程調(diào)試,包括配置Deployment、Service以及本地IDEA的調(diào)試設(shè)置,感興趣的朋友跟隨小編一起看看吧2025-02-02

