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

Spring Boot 中的 @ConditionalOnBean 注解場景分析

 更新時間:2025年03月22日 09:30:05   作者:yang_love1011  
本文詳細(xì)介紹了Spring Boot中的@ConditionalOnBean注解的使用場景、原理和基本用法,通過多個示例,展示了如何使用該注解根據(jù)Bean是否存在來動態(tài)地注冊或跳過特定的Bean,感興趣的朋友一起看看吧

1. 前言

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

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

2. @ConditionalOnBean 作用與基本用法

2.1 @ConditionalOnBean 的作用

@ConditionalOnBean 主要用于以下場景:

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

2.2 基本用法

示例:當(dāng) 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 實(shí)例,實(shí)際可用 HikariDataSource、Druid 等
        return new FakeDataSource();
    }
    @Bean
    @ConditionalOnBean(DataSource.class)  // 僅當(dāng) 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 存在時,當(dāng)前 Bean 才會被注冊。

@Bean
@ConditionalOnBean(value = DataSource.class)  // 僅當(dāng) 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 名稱是否存在 來決定當(dāng)前 Bean 是否加載。

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

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

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

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

3.4 search 屬性(搜索范圍)

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

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

  • ALL:在所有父子 ApplicationContext 中搜索。
  • CURRENT(默認(rèn)):僅搜索當(dāng)前 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 來控制自動配置。例如:

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

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

場景 3:可選依賴的組件

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

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

5. @ConditionalOnBean vs @ConditionalOnMissingBean

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

示例:

@Bean
@ConditionalOnMissingBean(DataSource.class)  // 僅當(dāng) 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)

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

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

相關(guān)文章

  • Java多線程中wait、notify、notifyAll使用詳解

    Java多線程中wait、notify、notifyAll使用詳解

    這篇文章主要介紹了Java多線程中wait、notify、notifyAll使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Spring Bean生命周期之BeanDefinition的合并過程詳解

    Spring Bean生命周期之BeanDefinition的合并過程詳解

    這篇文章主要為大家詳細(xì)介紹了Spring Bean生命周期之BeanDefinition的合并過程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

    2022-03-03
  • SpringBoot加載profile全面解析

    SpringBoot加載profile全面解析

    SpringBoot的Profile機(jī)制通過多配置文件和注解實(shí)現(xiàn)環(huán)境隔離,支持開發(fā)、測試、生產(chǎn)等不同環(huán)境的靈活配置切換,無需修改代碼,關(guān)鍵點(diǎn)包括配置文件命名規(guī)范、激活方式、優(yōu)先級及企業(yè)級安全部署實(shí)踐,本文介紹SpringBoot加載profile的過程,感興趣的朋友一起看看吧
    2025-08-08
  • 如何設(shè)置IDEA遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境并結(jié)合cpolar實(shí)現(xiàn)ssh遠(yuǎn)程開發(fā)(最新推薦)

    如何設(shè)置IDEA遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境并結(jié)合cpolar實(shí)現(xiàn)ssh遠(yuǎn)程開發(fā)(最新推薦)

    本文主要介紹如何在IDEA中設(shè)置遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境,并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)無公網(wǎng)遠(yuǎn)程連接,然后實(shí)現(xiàn)遠(yuǎn)程Linux環(huán)境進(jìn)行開發(fā),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • SpringBoot整合Redis實(shí)現(xiàn)登錄失敗鎖定功能(實(shí)例詳解)

    SpringBoot整合Redis實(shí)現(xiàn)登錄失敗鎖定功能(實(shí)例詳解)

    本文我們已經(jīng)探討如何利用Redis來實(shí)現(xiàn)鎖定賬戶的安全措施,以及通過SpringBoot整合Redis實(shí)現(xiàn)了這一功能,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2024-02-02
  • SpringBoot數(shù)據(jù)庫索引優(yōu)化指南

    SpringBoot數(shù)據(jù)庫索引優(yōu)化指南

    本文詳細(xì)介紹了MySQL慢查詢?nèi)罩镜呐渲门c分析方法,包括動態(tài)配置和修改配置文件兩種方式,以及SpringBoot項目中打印SQL執(zhí)行日志的配置,需要的朋友可以參考下
    2026-04-04
  • SpringBoot + Shiro前后端分離權(quán)限

    SpringBoot + Shiro前后端分離權(quán)限

    這篇文章主要為大家詳細(xì)介紹了SpringBoot + Shiro前后端分離權(quán)限,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • SpringBoot整合MyBatis和SpringBoot整合MyBatis-Plus教程

    SpringBoot整合MyBatis和SpringBoot整合MyBatis-Plus教程

    這篇文章主要介紹了SpringBoot整合MyBatis和SpringBoot整合MyBatis-Plus教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • SpringBoot整合Shiro和Redis的示例代碼

    SpringBoot整合Shiro和Redis的示例代碼

    這篇文章主要介紹了SpringBoot整合Shiro和Redis的示例代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Spring之@Lookup注解詳細(xì)解析

    Spring之@Lookup注解詳細(xì)解析

    這篇文章主要介紹了Spring之@Lookup注解詳細(xì)解析,當(dāng)采用@Autowired注解對單例bean注依賴的原型bean時,會由于單例bean只會創(chuàng)建一次,導(dǎo)致依賴的原型bean也只會注入一次,@Lookup注解可以較為優(yōu)雅的解決此類問題,需要的朋友可以參考下
    2024-01-01

最新評論

许昌市| 巢湖市| 漯河市| 敦煌市| 麻阳| 普兰店市| 临武县| 兴海县| 毕节市| 新龙县| 六枝特区| 鄂托克旗| 通山县| 鄄城县| 南通市| 平谷区| 托克逊县| 镇雄县| 红安县| 明溪县| 沈阳市| 桃园市| 南郑县| 上饶县| 沁水县| 阆中市| 仪征市| 新晃| 安阳县| 射阳县| 德阳市| 兴和县| 蒙自县| 增城市| 苗栗市| 和林格尔县| 莱州市| 湟源县| 南皮县| 绥化市| 安庆市|