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

SpringBoot中@ConditionalOnBean注解的具體使用

 更新時間:2025年06月26日 09:17:00   作者:weixin_98543211  
本文主要介紹了SpringBoot中@ConditionalOnBean注解的具體使用,用于根據(jù)是否存在指定Bean動態(tài)注冊Bean,支持類型、名稱、注解及搜索范圍控制,常見于按需加載、自動配置和可選依賴場景,與@ConditionalOnMissingBean形成條件對立

1. 前言

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

本篇文章將詳細介紹 @ConditionalOnBean 的使用場景、原理,并提供多個示例幫助理解。

2. @ConditionalOnBean 作用與基本用法

2.1 @ConditionalOnBean 的作用

@ConditionalOnBean 主要用于以下場景:

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

2.2 基本用法

示例:當 DataSource Bean 存在時,才創(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 實例,實際可用 HikariDataSource、Druid 等
        return new FakeDataSource();
    }

    @Bean
    @ConditionalOnBean(DataSource.class)  // 僅當 DataSource 存在時,才創(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 不會被創(chuàng)建。

3. @ConditionalOnBean 詳解

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

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

用于指定某種類型的 Bean 存在時,當前 Bean 才會被注冊。

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

等效于:

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

區(qū)別

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

3.2 name 屬性(指定 Bean 名稱)

用于 指定某個 Bean 名稱是否存在 來決定當前 Bean 是否加載。

@Bean
@ConditionalOnBean(name = "customBean")  // 僅當名為 customBean 的 Bean 存在時注冊
public MyComponent myComponent() {
    return new MyComponent();
}

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

可以指定某些 Bean 是否包含特定注解,如果包含,則當前 Bean 才會被注冊。

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

3.4 search 屬性(搜索范圍)

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

search 選項可以指定搜索范圍:

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

4. @ConditionalOnBean 使用場景

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

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

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

場景 2:啟用某些自動配置

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

  • 只有當 DispatcherServlet 存在時,Spring MVC 相關(guān)的自動配置才會生效。
@Configuration
@ConditionalOnBean(DispatcherServlet.class)
public class MvcAutoConfiguration {
    // 僅當 DispatcherServlet 存在時,Spring MVC 配置生效
}

場景 3:可選依賴的組件

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

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

5. @ConditionalOnBean vs @ConditionalOnMissingBean

注解作用
@ConditionalOnBean當指定 Bean 存在時,才注冊當前 Bean
@ConditionalOnMissingBean當指定 Bean 不存在時,才注冊當前 Bean

示例:

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

6. 結(jié)論

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

總結(jié):

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

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

相關(guān)文章

  • SpringBoot3實現(xiàn)上傳圖片并返回路徑讓前端顯示圖片

    SpringBoot3實現(xiàn)上傳圖片并返回路徑讓前端顯示圖片

    這篇文章主要介紹了SpringBoot3實現(xiàn)上傳圖片并返回路徑讓前端顯示圖片,文中通過圖文和代碼講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • springcloud feign調(diào)其他微服務(wù)時參數(shù)是對象的問題

    springcloud feign調(diào)其他微服務(wù)時參數(shù)是對象的問題

    這篇文章主要介紹了springcloud feign調(diào)其他微服務(wù)時參數(shù)是對象的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Maven默認使用JDK1.5的問題及解決方案

    Maven默認使用JDK1.5的問題及解決方案

    這篇文章主要介紹了Maven默認使用JDK1.5的問題及解決方案,本文給大家分享兩種方式,通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Mybatis第三方PageHelper分頁插件的使用與原理

    Mybatis第三方PageHelper分頁插件的使用與原理

    提到插件相信大家都知道,插件的存在主要是用來改變或者增強原有的功能,MyBatis中也一樣,下面這篇文章主要給大家介紹了關(guān)于Mybatis第三方PageHelper分頁插件的使用與原理,需要的朋友可以參考下
    2022-02-02
  • Java的動態(tài)代理模式之Cglib代理詳解

    Java的動態(tài)代理模式之Cglib代理詳解

    這篇文章主要介紹了Java的動態(tài)代理模式之Cglib代理詳解,Cglib代理也叫作?子類代理,它是在內(nèi)存中構(gòu)建一個子類對象從而實現(xiàn)對目標對象功能擴展,?有些書也將Cglib代理歸屬到動態(tài)代理,需要的朋友可以參考下
    2023-11-11
  • Java中sharding-jdbc 綁定表的實現(xiàn)

    Java中sharding-jdbc 綁定表的實現(xiàn)

    綁定表是 ShardingSphere-JDBC 解決跨庫表關(guān)聯(lián)查詢的核心機制,通過強制分片鍵和算法一致的表路由到同一物理庫,實現(xiàn)高效本地關(guān)聯(lián),適用于大表之間的關(guān)聯(lián)場景,避免了全局表的存儲冗余,下面就來詳細的介紹一下如何使用,感興趣的可以了解一下
    2026-03-03
  • Java構(gòu)造代碼塊,靜態(tài)代碼塊原理與用法實例分析

    Java構(gòu)造代碼塊,靜態(tài)代碼塊原理與用法實例分析

    這篇文章主要介紹了Java構(gòu)造代碼塊,靜態(tài)代碼塊,結(jié)合實例形式分析了Java構(gòu)造代碼塊,靜態(tài)代碼塊的功能、原理、用法及操作注意事項,需要的朋友可以參考下
    2020-04-04
  • 創(chuàng)建網(wǎng)關(guān)項目(Spring Cloud Gateway)過程詳解

    創(chuàng)建網(wǎng)關(guān)項目(Spring Cloud Gateway)過程詳解

    這篇文章主要介紹了創(chuàng)建網(wǎng)關(guān)項目(Spring Cloud Gateway)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • 分析講解Java?Random類里的種子問題

    分析講解Java?Random類里的種子問題

    Random類中實現(xiàn)的隨機算法是偽隨機,也就是有規(guī)則的隨機。在進行隨機時,隨機算法的起源數(shù)字稱為種子數(shù)(seed),在種子數(shù)的基礎(chǔ)上進行一定的變換,從而產(chǎn)生需要的隨機數(shù)字
    2022-05-05
  • spring boot 學習筆記(入門篇)

    spring boot 學習筆記(入門篇)

    ing Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這篇文章給大家?guī)砹藄pring boot 入門學習筆記,需要的朋友參考下
    2018-02-02

最新評論

长宁区| 陕西省| 封开县| 陇南市| 吉隆县| 台山市| 准格尔旗| 望江县| 偃师市| 祁东县| 苍溪县| 新和县| 伊金霍洛旗| 沧源| 筠连县| 探索| 三明市| 新丰县| 开原市| 通渭县| 镇江市| 江陵县| 兰考县| 务川| 庆阳市| 广饶县| 乐陵市| 夏河县| 静宁县| 黄大仙区| 英吉沙县| 那坡县| 普格县| 普安县| 建阳市| 望江县| 莫力| 永兴县| 洱源县| 仲巴县| 随州市|