最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 中的 @ConditionalOnBean 注解作用及基本用法

 更新時(shí)間:2025年04月15日 10:10:19   作者:weixin_98543211  
在 Spring Boot 中,@ConditionalOnBean 可以幫助我們根據(jù) 是否存在特定 Bean 來 動(dòng)態(tài)注冊(cè) Bean,廣泛用于 按需加載、自動(dòng)配置 等場(chǎng)景,本文給大家介紹Spring Boot 中的 @ConditionalOnBean 注解,感興趣的朋友一起看看吧

1. 前言

在 Spring Boot 中,條件注解(Conditional 注解) 是一種強(qiáng)大的功能,允許我們根據(jù)某些條件動(dòng)態(tài)地注冊(cè)或跳過特定的 Bean。其中,@ConditionalOnBean 是最常用的條件注解之一,它的作用是:當(dāng) Spring 容器中存在指定的 Bean 時(shí),當(dāng)前 Bean 才會(huì)被注冊(cè)。

本篇文章將詳細(xì)介紹 @ConditionalOnBean 的使用場(chǎng)景、原理,并提供多個(gè)示例幫助理解。

2.@ConditionalOnBean 作用與基本用法

2.1 @ConditionalOnBean 的作用

@ConditionalOnBean 主要用于以下場(chǎng)景:

  • 按需加載 Bean:只有在某個(gè) Bean 存在時(shí),另一個(gè) Bean 才會(huì)被創(chuàng)建。
  • 模塊化設(shè)計(jì):某些功能模塊需要依賴特定 Bean 才能啟用,例如 僅當(dāng)某個(gè)組件存在時(shí),自動(dòng)配置才會(huì)生效。
  • 避免 Bean 沖突:如果某個(gè) Bean 依賴其他 Bean,則可使用 @ConditionalOnBean 確保它不會(huì)因缺少依賴而加載失敗。

2.2 基本用法

示例:當(dāng) DataSource Bean 存在時(shí),才創(chuàng)建 MyService Bean

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class MyConfig {
    @Bean
    public DataSource dataSource() {
        // 這里模擬 DataSource 實(shí)例,實(shí)際可用 HikariDataSource、Druid 等
        return new FakeDataSource();
    }
    @Bean
    @ConditionalOnBean(DataSource.class)  // 僅當(dāng) DataSource 存在時(shí),才創(chuàng)建 MyService
    public MyService myService() {
        return new MyService();
    }
}
class MyService {
    public MyService() {
        System.out.println("MyService 被創(chuàng)建");
    }
}
class FakeDataSource implements DataSource {
    // 這里可以模擬 DataSource 方法
}

執(zhí)行結(jié)果

MyService 被創(chuàng)建

如果 dataSource() 方法被注釋掉,則 MyService 不會(huì)被創(chuàng)建。

3. @ConditionalOnBean 詳解

@ConditionalOnBean 提供了多個(gè)屬性,可以更加靈活地控制 Bean 的創(chuàng)建。

3.1 value 和 type 屬性(指定 Bean 類型)

用于指定某種類型的 Bean 存在時(shí),當(dāng)前 Bean 才會(huì)被注冊(cè)。

@Bean
@ConditionalOnBean(value = DataSource.class)  // 僅當(dāng) DataSource 存在時(shí)生效
public MyRepository myRepository() {
    return new MyRepository();
}

等效于:

@Bean
@ConditionalOnBean(type = "javax.sql.DataSource")  // 使用全限定類名
public MyRepository myRepository() {
    return new MyRepository();
}

區(qū)別

  • value:直接使用 Class 類型,編譯時(shí)檢查更安全。
  • type:使用字符串,可用于避免某些類找不到(如可選依賴)。

3.2 name 屬性(指定 Bean 名稱)

用于 指定某個(gè) Bean 名稱是否存在 來決定當(dāng)前 Bean 是否加載。

@Bean
@ConditionalOnBean(annotation = Repository.class)  // 僅當(dāng)存在 @Repository 注解的 Bean 時(shí)生效
public MyService myService() {
    return new MyService();
}

3.3 annotation 屬性(指定 Bean 需要標(biāo)注的注解)

可以指定某些 Bean 是否包含特定注解,如果包含,則當(dāng)前 Bean 才會(huì)被注冊(cè)。

@Bean
@ConditionalOnBean(annotation = Repository.class)  // 僅當(dāng)存在 @Repository 注解的 Bean 時(shí)生效
public MyService myService() {
    return new MyService();
}

3.4 search屬性(搜索范圍)

默認(rèn)情況下,@ConditionalOnBean 只會(huì)在 當(dāng)前應(yīng)用上下文 中查找 Bean,而不會(huì)查找 父上下文(即 Spring Boot 的 ApplicationContext 層級(jí))。

search 選項(xiàng)可以指定搜索范圍:

  • ALL:在所有父子 ApplicationContext 中搜索。
  • CURRENT(默認(rèn)):僅搜索當(dāng)前 ApplicationContext。
@Bean
@ConditionalOnBean(value = DataSource.class, search = SearchStrategy.ALL) // 在所有上下文中搜索
public MyService myService() {
    return new MyService();
}

4. @ConditionalOnBean 使用場(chǎng)景

場(chǎng)景 1:按需加載數(shù)據(jù)庫(kù)相關(guān) Bean

如果應(yīng)用程序中 使用了數(shù)據(jù)庫(kù),則提供一個(gè) DatabaseService,否則不創(chuàng)建:

@Bean
@ConditionalOnBean(DataSource.class)
public DatabaseService databaseService() {
    return new DatabaseService();
}

場(chǎng)景 2:?jiǎn)⒂媚承┳詣?dòng)配置

Spring Boot 的 spring-boot-autoconfigure 模塊大量使用 @ConditionalOnBean 來控制自動(dòng)配置。例如:

只有當(dāng) DispatcherServlet 存在時(shí),Spring MVC 相關(guān)的自動(dòng)配置才會(huì)生效

@Configuration
@ConditionalOnBean(DispatcherServlet.class)
public class MvcAutoConfiguration {
    // 僅當(dāng) DispatcherServlet 存在時(shí),Spring MVC 配置生效
}

場(chǎng)景 3:可選依賴的組件

有時(shí),某些功能是可選的,比如當(dāng) Redis 組件存在時(shí),才創(chuàng)建緩存管理器:

@Bean
@ConditionalOnBean(name = "redisTemplate")  // 只有當(dāng) redisTemplate 存在時(shí)才加載
public CacheManager cacheManager() {
    return new RedisCacheManager();
}

5. @ConditionalOnBean vs @ConditionalOnMissingBean

注解作用
@ConditionalOnBean當(dāng)指定 Bean 存在時(shí),才注冊(cè)當(dāng)前 Bean
@ConditionalOnMissingBean當(dāng)指定 Bean 不存在時(shí),才注冊(cè)當(dāng)前 Bean

示例:

@Bean
@ConditionalOnMissingBean(DataSource.class)  // 僅當(dāng) DataSource 不存在時(shí)才創(chuàng)建
public DataSource defaultDataSource() {
    return new DefaultDataSource();
}

6. 結(jié)論

在 Spring Boot 中,@ConditionalOnBean 可以幫助我們根據(jù) 是否存在特定 Bean動(dòng)態(tài)注冊(cè) Bean,廣泛用于 按需加載、自動(dòng)配置 等場(chǎng)景。

總結(jié):

? 指定 Bean 類型@ConditionalOnBean(DataSource.class)
? 指定 Bean 名稱@ConditionalOnBean(name = "customBean")
? 指定 Bean 注解@ConditionalOnBean(annotation = Repository.class)
? 搜索范圍@ConditionalOnBean(search = SearchStrategy.ALL)

你在項(xiàng)目中用過 @ConditionalOnBean 嗎?歡迎留言分享你的經(jīng)驗(yàn)!??

到此這篇關(guān)于Spring Boot 中的 @ConditionalOnBean 注解詳解的文章就介紹到這了,更多相關(guān)Spring Boot @ConditionalOnBean 注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇文章帶你了解JVM內(nèi)存模型

    一篇文章帶你了解JVM內(nèi)存模型

    本文講解了Java 內(nèi)存模型來看看解決可見性、有序性問題的 Java 內(nèi)存模型(JMM),今天通過本文給大家介紹Java 內(nèi)存模型(JVM)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-09-09
  • 解析springcloud中的Hystrix

    解析springcloud中的Hystrix

    Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲和容錯(cuò)的開源庫(kù),在分布式系統(tǒng)里,許多依賴不可避免的會(huì)調(diào)用失敗,比如超時(shí)、異常等。這篇文章主要介紹了springcloud中的Hystrix,需要的朋友可以參考下
    2020-10-10
  • Centos6.5下Jdk+Tomcat+Mysql環(huán)境安裝圖文教程

    Centos6.5下Jdk+Tomcat+Mysql環(huán)境安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了Centos6.5系統(tǒng)下Jdk+Tomcat+Mysql環(huán)境安裝過程,感興趣的小伙伴們可以參考一下
    2016-05-05
  • java多線程編程之Synchronized塊同步方法

    java多線程編程之Synchronized塊同步方法

    這篇文章主要介紹了java多線程編程之Synchronized塊同步方法,synchronized關(guān)鍵字又稱同步鎖,當(dāng)方法執(zhí)行完后,會(huì)自動(dòng)釋放鎖鎖,只有一個(gè)線程能進(jìn)入此方法,看看下文中各種例子對(duì)synchronized的詳細(xì)解釋
    2015-12-12
  • Springboot+devtools配置熱部署過程

    Springboot+devtools配置熱部署過程

    SpringBoot提供的spring-boot-devtools模塊可以實(shí)現(xiàn)應(yīng)用的熱部署,極大提升開發(fā)效率,通過添加POM依賴、配置yml文件、使用IDE快捷鍵等步驟,可以無需手動(dòng)重啟即可自動(dòng)加載變更,這種方式不僅適用于靜態(tài)文件的自動(dòng)加載,也適用于整個(gè)SpringBoot工程,是提高開發(fā)效率的有效手段
    2024-11-11
  • Maven離線模式打包全過程

    Maven離線模式打包全過程

    這篇文章主要介紹了Maven離線模式打包全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 基于TCP通信丟包原因總結(jié)(推薦)

    基于TCP通信丟包原因總結(jié)(推薦)

    下面小編就為大家?guī)硪黄赥CP通信丟包原因總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Mybatis 多對(duì)一查詢的實(shí)現(xiàn)方法

    Mybatis 多對(duì)一查詢的實(shí)現(xiàn)方法

    這篇文章主要介紹了Mybatis 多對(duì)一查詢,本文通過場(chǎng)景分析示例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Java中使用JWT生成Token進(jìn)行接口鑒權(quán)實(shí)現(xiàn)方法

    Java中使用JWT生成Token進(jìn)行接口鑒權(quán)實(shí)現(xiàn)方法

    這篇文章主要介紹了Java中使用JWT生成Token進(jìn)行接口鑒權(quán)實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 一文徹底搞定Java哈希表和哈希沖突

    一文徹底搞定Java哈希表和哈希沖突

    本文介紹了什么是哈希表?什么是哈希函數(shù)?什么是哈希沖突?三個(gè)問題的解決方案,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

竹山县| 句容市| 开平市| 米泉市| 南陵县| 桑植县| 利川市| 巴青县| 临潭县| 乌苏市| 深水埗区| 赣州市| 浦城县| 延津县| 张家界市| 陵水| 延边| 绥德县| 达孜县| 济源市| 呼伦贝尔市| 平果县| 安丘市| 临海市| 剑川县| 湘潭县| 抚顺县| 侯马市| 贞丰县| 山东省| 杂多县| 公主岭市| 姚安县| 凤山县| 乌兰县| 宜昌市| 灵武市| 玉环县| 台山市| 哈密市| 武邑县|