欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1. 前言

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

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

2.@ConditionalOnBean 作用與基本用法

2.1 @ConditionalOnBean 的作用

@ConditionalOnBean 主要用于以下場景:

  • 按需加載 Bean:只有在某個 Bean 存在時,另一個 Bean 才會被創(chuàng)建。
  • 模塊化設計:某些功能模塊需要依賴特定 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í)行結果

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(annotation = Repository.class)  // 僅當存在 @Repository 注解的 Bean 時生效
public MyService myService() {
    return new MyService();
}

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

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

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

3.4 search屬性(搜索范圍)

默認情況下,@ConditionalOnBean 只會在 當前應用上下文 中查找 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ù)庫相關 Bean

如果應用程序中 使用了數(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 相關的自動配置才會生效。

@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. 結論

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

總結:

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

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

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

相關文章

  • 使用WebSocket實現(xiàn)即時通訊(一個群聊的聊天室)

    使用WebSocket實現(xiàn)即時通訊(一個群聊的聊天室)

    這篇文章主要為大家詳細介紹了使用WebSocket實現(xiàn)即使通訊,實現(xiàn)一個群聊的聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • mybatis-plugin插件執(zhí)行原理解析

    mybatis-plugin插件執(zhí)行原理解析

    這篇文章主要介紹了mybatis-plugin插件執(zhí)行原理,我們就需要來研究下Executor,ParameterHandler,ResultSetHandler,StatementHandler這4個對象的具體跟sql相關的方法,然后再進行修改,就可以直接起到aop的作用,需要的朋友可以參考下
    2022-10-10
  • java語言中封裝類代碼示例

    java語言中封裝類代碼示例

    這篇文章主要介紹了java語言中封裝類,涉及相關代碼示例及結果分析,以及封裝的好處簡單介紹,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • struts2單個文件上傳的兩種實現(xiàn)方式

    struts2單個文件上傳的兩種實現(xiàn)方式

    這篇文章主要介紹了struts2單個文件上傳的兩種實現(xiàn)方式,有需要的朋友可以參考一下
    2014-01-01
  • Java中Lambda表達式的使用詳解

    Java中Lambda表達式的使用詳解

    Lambda 表達式,也可稱為閉包,它是推動 Java 8 發(fā)布的最重要新特性。Lambda 允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞進方法中)。使用 Lambda 表達式可以使代碼變的更加簡潔緊湊
    2021-09-09
  • springboot-mysql-HikariCP集成過程

    springboot-mysql-HikariCP集成過程

    HiKariCP opens new window是數(shù)據(jù)庫連接池的一個后起之秀,號稱性能最好,可以完美地 PK 掉其他連接池,這篇文章主要介紹了springboot-mysql-HikariCP集成過程,需要的朋友可以參考下
    2023-07-07
  • SpringMVC + jquery.uploadify實現(xiàn)上傳文件功能

    SpringMVC + jquery.uploadify實現(xiàn)上傳文件功能

    文件上傳是很多項目都會使用到的功能,SpringMVC當然也提供了這個功能。不過小編不建議在項目中通過form表單來提交文件上傳,這樣做的局限性很大。下面這篇文章主要介紹了利用SpringMVC + jquery.uploadify實現(xiàn)上傳文件功能的相關資料,需要的朋友可以參考下。
    2017-06-06
  • 詳解netty中常用的xml編碼解碼器

    詳解netty中常用的xml編碼解碼器

    這篇文章主要介紹了netty中常用的xml編碼解碼器,進行frame拆分可以使用XmlFrameDecoder,進行xml文件內容的解析則可以使用XmlDecoder,接下來我們會詳細講解兩個decoder實現(xiàn)和使用,感興趣的朋友一起看看吧
    2022-05-05
  • java代碼實現(xiàn)截圖功能(屏幕截圖)

    java代碼實現(xiàn)截圖功能(屏幕截圖)

    java代碼實現(xiàn)截圖功能,該JavaBean可以直接在其他Java應用程序中調用,默認的文件前綴為GuiCamera,文件格式為PNG格式,直接使用下面的類吧
    2013-12-12
  • Springboot項目中定時任務的四種實現(xiàn)方式詳解

    Springboot項目中定時任務的四種實現(xiàn)方式詳解

    Spring的@Scheduled注解是一種非常簡單和便捷的實現(xiàn)定時任務的方式,通過在方法上添加@Scheduled注解,我們可以指定方法在特定的時間間隔或固定的時間點執(zhí)行,本文給大家介紹Springboot項目中定時任務的四種實現(xiàn)方式,感興趣的的朋友一起看看b
    2024-02-02

最新評論