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

SpringBoot中的條件注解使用示例詳解

 更新時間:2025年08月23日 10:22:35   作者:寒士obj  
SpringBoot條件注解用于動態(tài)控制Bean創(chuàng)建與配置加載,基于@Conditional機制,支持按類、Bean、屬性等條件判斷,廣泛應(yīng)用于多數(shù)據(jù)源等場景,提升應(yīng)用靈活性與智能化,接下來通過本文給大家講解SpringBoot中的條件注解使用,感興趣的朋友一起看看吧

前言

在SpringBoot開發(fā)中,我們經(jīng)常會遇到這樣的場景:某些Bean只有在特定條件下才需要被創(chuàng)建,或者根據(jù)不同的環(huán)境加載不同的配置。SpringBoot的條件注解就是為了解決這類問題而設(shè)計的。

什么是條件注解

條件注解是SpringBoot提供的一套機制,允許我們根據(jù)特定條件來決定是否創(chuàng)建Bean、加載配置或執(zhí)行某些邏輯。這些注解基于Spring 4.0引入的@Conditional注解,SpringBoot在此基礎(chǔ)上擴展了更多實用的條件注解。

核心原理

所有的條件注解都基于@Conditional注解,該注解需要指定一個Condition接口的實現(xiàn)類。Condition接口只有一個方法:

public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

當Spring容器加載Bean時,會調(diào)用這個方法來判斷條件是否滿足。如果返回true,則創(chuàng)建Bean;如果返回false,則跳過。

常用條件注解詳解

1. @ConditionalOnClass和@ConditionalOnMissingClass

這兩個注解用于檢查類路徑中是否存在指定的類。

@Configuration
public class DatabaseConfig {
    // 當類路徑中存在DataSource類時才創(chuàng)建這個Bean
    @Bean
    @ConditionalOnClass(DataSource.class)
    public DataSource dataSource() {
        return new HikariDataSource();
    }
    // 當類路徑中不存在Redis相關(guān)類時才創(chuàng)建內(nèi)存緩存
    @Bean
    @ConditionalOnMissingClass("org.springframework.data.redis.core.RedisTemplate")
    public CacheManager memoryCache() {
        return new ConcurrentMapCacheManager();
    }
}

2. @ConditionalOnBean和@ConditionalOnMissingBean

這兩個注解根據(jù)Spring容器中是否存在指定的Bean來決定是否創(chuàng)建。

@Configuration
public class ServiceConfig {
    // 當容器中存在UserRepository Bean時才創(chuàng)建UserService
    @Bean
    @ConditionalOnBean(UserRepository.class)
    public UserService userService(UserRepository userRepository) {
        return new UserServiceImpl(userRepository);
    }
    // 當容器中不存在CacheManager時才創(chuàng)建默認的
    @Bean
    @ConditionalOnMissingBean(CacheManager.class)
    public CacheManager defaultCacheManager() {
        return new NoOpCacheManager();
    }
}

3. @ConditionalOnProperty

根據(jù)配置屬性來決定是否創(chuàng)建Bean,這是最常用的條件注解之一。

@Configuration
public class FeatureConfig {
    // 當spring.feature.enabled=true時才啟用這個功能
    @Bean
    @ConditionalOnProperty(
        prefix = "spring.feature",
        name = "enabled",
        havingValue = "true",
        matchIfMissing = false // 默認false,即屬性不存在時不匹配
    )
    public FeatureService featureService() {
        return new FeatureServiceImpl();
    }
}

應(yīng)用場景:多數(shù)據(jù)源配置

@Configuration
public class DataSourceConfig {
    @Primary
    @Bean
    @ConditionalOnProperty(name = "app.datasource.primary.enabled", havingValue = "true")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create()
            .url("jdbc:mysql://localhost:3306/primary")
            .build();
    }
    @Bean
    @ConditionalOnProperty(name = "app.datasource.secondary.enabled", havingValue = "true")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create()
            .url("jdbc:mysql://localhost:3306/secondary")
            .build();
    }
}

在SpringBoot自動配置中的核心作用

SpringBoot的自動配置是其最核心的特性之一,而條件注解正是自動配置得以智能化的關(guān)鍵所在。讓我們深入了解條件注解在自動配置中是如何發(fā)揮作用的。

自動配置的工作原理

SpringBoot通過spring.factories文件定義了所有的自動配置類,啟動時會加載這些配置。但是,并不是所有的配置都應(yīng)該被激活,這就需要條件注解來控制。

# META-INF/spring.factories示例
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

經(jīng)典自動配置示例分析

讓我們看看SpringBoot內(nèi)置的一些自動配置是如何使用條件注解的:

  1. RedisAutoConfiguration
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)  // Redis類存在時才配置
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate")  // 用戶沒有自定義時才創(chuàng)建
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        return new StringRedisTemplate(redisConnectionFactory);
    }
}
  1. DataSourceAutoConfiguration
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "javax.sql.DataSource")  // 沒有數(shù)據(jù)源時才自動配置
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class,
         DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {
    @Configuration(proxyBeanMethods = false)
    @Conditional(EmbeddedDatabaseCondition.class)  // 自定義條件判斷
    @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
    @Import(EmbeddedDataSourceConfiguration.class)
    protected static class EmbeddedDatabaseConfiguration {
    }
    @Configuration(proxyBeanMethods = false)
    @Conditional(PooledDataSourceCondition.class)
    @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
    @Import({ HikariConfiguration.class, TomcatConfiguration.class,
             DbcpConfiguration.class, OracleUcpConfiguration.class,
             GenericConfiguration.class, DataSourceJmxConfiguration.class })
    protected static class PooledDataSourceConfiguration {
    }
}

總結(jié)

SpringBoot的條件注解是一個非常強大的特性,它讓我們能夠構(gòu)建更加靈活和智能的應(yīng)用程序。通過合理使用這些注解,不僅能讓我們寫出更優(yōu)雅的代碼,也能讓我們的應(yīng)用在面對不同場景時表現(xiàn)得更加智能。希望這篇文章能幫助大家更好地理解和使用SpringBoot的條件注解。

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

相關(guān)文章

  • java 中平方根(sqrt)算法 的實例詳解

    java 中平方根(sqrt)算法 的實例詳解

    這篇文章主要介紹了java 中平方根(sqrt)算法 的實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java中讀取文件轉(zhuǎn)換為字符串的方法

    Java中讀取文件轉(zhuǎn)換為字符串的方法

    今天小編就為大家分享一篇Java中讀取文件轉(zhuǎn)換為字符串的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • SpringBoot使用mybatis步驟總結(jié)

    SpringBoot使用mybatis步驟總結(jié)

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著SpringBoot使用mybatis步驟展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Spring Cloud Feign文件傳輸?shù)氖纠a

    Spring Cloud Feign文件傳輸?shù)氖纠a

    微服務(wù)中通常使用 Feign 作為服務(wù)消費者,那么如何使用 Feign 接口傳輸文件呢?這篇文章主要介紹了Spring Cloud Feign文件傳輸?shù)氖纠a,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Java分布式ID中Snowflake雪花算法應(yīng)用實現(xiàn)

    Java分布式ID中Snowflake雪花算法應(yīng)用實現(xiàn)

    Snowflake算法作為一種高效且易于實現(xiàn)的分布式ID生成方案,能夠很好地滿足分布式系統(tǒng)中對全局唯一ID的需求,本文就來介紹一下Java分布式ID中Snowflake雪花算法應(yīng)用實現(xiàn),感興趣的可以了解一下
    2024-07-07
  • Java中IO流文件讀取、寫入和復(fù)制的實例

    Java中IO流文件讀取、寫入和復(fù)制的實例

    下面小編就為大家?guī)硪黄狫ava中IO流文件讀取、寫入和復(fù)制的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • SpringBoot使用Jackson配置全局時間日期格式

    SpringBoot使用Jackson配置全局時間日期格式

    本文主要介紹了SpringBoot使用Jackson配置全局時間日期格式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • springboot集成redis實現(xiàn)消息的訂閱與發(fā)布

    springboot集成redis實現(xiàn)消息的訂閱與發(fā)布

    本文主要介紹了springboot集成redis實現(xiàn)消息的訂閱與發(fā)布,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Spring Security常用配置的使用解讀

    Spring Security常用配置的使用解讀

    這篇文章主要介紹了Spring Security常用配置的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Java設(shè)計模式之狀態(tài)模式詳解

    Java設(shè)計模式之狀態(tài)模式詳解

    Java?中的狀態(tài)模式(State?Pattern)是一種行為型設(shè)計模式,它允許對象在內(nèi)部狀態(tài)發(fā)生改變時改變其行為,本文將詳細介紹?Java?中的狀態(tài)模式,我們將從狀態(tài)模式的概述、結(jié)構(gòu)與實現(xiàn)、優(yōu)缺點、適用場景等方面進行講解,需要的朋友可以參考下
    2023-05-05

最新評論