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

Java注解@Conditional與@Profile的使用區(qū)別

 更新時間:2025年05月10日 16:42:11   作者:Stay?Passion  
這篇文章主要介紹了Java注解@Conditional與@Profile的使用區(qū)別,@Profile和@Conditional是Spring提供的兩種常用機制,它們可以根據(jù)不同的條件動態(tài)決定某些Bean是否加載,從而實現(xiàn)環(huán)境隔離、模塊選擇、特性開關等功能,需要的朋友可以參考下

前言

在 Spring 應用開發(fā)中,條件化 Bean 注冊是配置靈活性的關鍵一環(huán)。@Profile@Conditional 是 Spring 提供的兩種常用機制,它們可以根據(jù)不同的條件動態(tài)決定某些 Bean 是否加載,從而實現(xiàn)環(huán)境隔離、模塊選擇、特性開關等功能。本文將系統(tǒng)講解這兩個注解的作用、使用方式及它們之間的區(qū)別與協(xié)同方式。

一、什么是@Profile

基本概念

@Profile 注解用于指定某個 Bean 或配置類僅在指定的 Profile 環(huán)境下生效。它常用于區(qū)分開發(fā)、測試和生產環(huán)境的配置。

@Configuration
@Profile("dev")
public class DevDataSourceConfig {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource("jdbc:mysql://localhost/dev_db");
    }
}

激活方式

  • application.yml: spring.profiles.active: dev
  • 啟動參數(shù):--spring.profiles.active=dev
  • SpringApplicationBuilder: .profiles("dev")

二、什么是@Conditional

基本概念

@Conditional 注解提供更通用的條件判斷能力。它的參數(shù)是一個實現(xiàn)了 Condition 接口的類,Spring 會調用該類的 matches 方法決定是否加載對應的 Bean。

@Bean
@Conditional(WindowsCondition.class)
public ListService windowsListService() {
    return new WindowsListService();
}

自定義Condition 示例

public class WindowsCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("os.name").contains("Windows");
    }
}

三、兩者的對比

維度@Profile@Conditional
粒度環(huán)境級別配置代碼級別、屬性級別、任意條件
簡潔性簡潔易用,約定大于配置靈活但需要手動實現(xiàn) Condition 接口
適用場景多環(huán)境配置隔離(dev/test/prod)按任意運行時條件控制 Bean 加載,如系統(tǒng)變量、類存在性等
可組合性可配合 @Configuration、@Component 使用可與任意 Spring 注解組合
底層原理本質是 @Conditional(ProfileCondition.class)完全自定義 Condition 實現(xiàn)類

四、實戰(zhàn)示例

Profile+Conditional聯(lián)合使用

@Configuration
@Profile("prod")
public class CacheConfig {
    @Bean
    @Conditional(RedisPresentCondition.class)
    public CacheManager redisCacheManager() {
        return new RedisCacheManager();
    }
}

此配置表示僅在 prod 環(huán)境下,且類路徑中存在 RedisClient 類時,才創(chuàng)建 redisCacheManager Bean。

五、進階@Conditional派生注解

Spring Boot 提供了多個 @Conditional 的派生注解,簡化了常見場景的條件配置:

@ConditionalOnProperty

作用:根據(jù)配置文件中某個屬性是否存在及其值決定是否加載 Bean

@Bean
@ConditionalOnProperty(name = "feature.user.enable", havingValue = "true", matchIfMissing = false)
public UserFeatureService featureService() {
    return new UserFeatureService();
}

@ConditionalOnMissingBean

作用:僅在指定 Bean 不存在時注冊當前 Bean,用于提供默認實現(xiàn)。

@Bean
@ConditionalOnMissingBean(DataSource.class)
public DataSource defaultDataSource() {
    return new HikariDataSource();
}

@ConditionalOnBean

作用:當 Spring 上下文中存在某個 Bean 時,才注入當前 Bean。

@Bean
@ConditionalOnBean(RedisClient.class)
public CacheManager redisCacheManager() {
    return new RedisCacheManager();
}

@ConditionalOnClass

作用:當類路徑下存在某個類時才加載 Bean,適合做組件自動裝配。

@Bean
@ConditionalOnClass(name = "com.fasterxml.jackson.databind.ObjectMapper")
public JsonConverter jsonConverter() {
    return new JacksonJsonConverter();
}

這些注解極大簡化了自動配置的條件邏輯,是 Spring Boot 自動裝配機制的核心支撐。

六、總結

注解作用適合場景
@Profile按環(huán)境(如 dev/prod)激活 Bean多環(huán)境隔離配置
@Conditional根據(jù)任意條件(如操作系統(tǒng)、類路徑)激活 Bean靈活控制、擴展性強的模塊化配置

在實際項目中,兩者可結合使用,構建高度靈活、可配置的應用架構,是 Spring 框架解耦和模塊控制的重要工具。

建議在配置類中大量使用 @Profile 做環(huán)境隔離,在具體 Bean 中使用 @Conditional 做條件控制。

以上就是Java注解@Conditional與@Profile的使用區(qū)別的詳細內容,更多關于Java注解@Conditional與@Profile的資料請關注腳本之家其它相關文章!

相關文章

  • Java代碼中4種字符串拼接方式分析

    Java代碼中4種字符串拼接方式分析

    本文主要介紹了Java代碼中4種字符串拼接方式分析,主要介紹了“+”號、StringBuilder、StringJoiner、String#join,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Springboot詳解如何實現(xiàn)SQL注入過濾器過程

    Springboot詳解如何實現(xiàn)SQL注入過濾器過程

    這篇文章主要介紹了基于springboot實現(xiàn)SQL注入過濾器,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2022-06-06
  • java學習筆記之馬踏棋盤算法

    java學習筆記之馬踏棋盤算法

    這篇文章主要為大家詳細介紹了java學習筆記之馬踏棋盤算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Javadoc標簽和Javadoc注釋規(guī)范說明

    Javadoc標簽和Javadoc注釋規(guī)范說明

    這篇文章主要介紹了Javadoc標簽和Javadoc注釋規(guī)范說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • spring框架學習總結

    spring框架學習總結

    Spring是于2003 年興起的一個輕量級的Java 開發(fā)框架,由Rod Johnson創(chuàng)建。簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架
    2021-06-06
  • Java面向對象之什么是異常

    Java面向對象之什么是異常

    Java 把異常當作對象來處理,并定義一個基類,java.lang.Throwable 作為所有異常的超類。今天通過本文給大家分享Java面向對象之什么是異常,感興趣的朋友一起看看吧
    2021-07-07
  • Java集合操作之List接口及其實現(xiàn)方法詳解

    Java集合操作之List接口及其實現(xiàn)方法詳解

    這篇文章主要介紹了Java集合操作之List接口及其實現(xiàn)方法,詳細分析了Java集合操作中List接口原理、功能、用法及操作注意事項,需要的朋友可以參考下
    2015-07-07
  • Java利用WatchService監(jiān)聽文件變化示例

    Java利用WatchService監(jiān)聽文件變化示例

    本篇文章主要介紹了Java利用WatchService監(jiān)聽文件變化示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • java 查詢oracle數(shù)據(jù)庫所有表DatabaseMetaData的用法(詳解)

    java 查詢oracle數(shù)據(jù)庫所有表DatabaseMetaData的用法(詳解)

    下面小編就為大家?guī)硪黄猨ava 查詢oracle數(shù)據(jù)庫所有表DatabaseMetaData的用法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Java?中的靜態(tài)字段和靜態(tài)方法?

    Java?中的靜態(tài)字段和靜態(tài)方法?

    這篇文章主要介紹了Java中的靜態(tài)字段和靜態(tài)方法,文章圍繞Java?靜態(tài)方法展開詳細內容,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-03-03

最新評論

白朗县| 柯坪县| 汨罗市| 来安县| 青岛市| 彩票| 乌兰县| 浦东新区| 马公市| 宜州市| 胶州市| 华蓥市| 萍乡市| 二手房| 东海县| 麻江县| 南汇区| 汝城县| 西畴县| 阿鲁科尔沁旗| 色达县| 天津市| 常山县| 罗定市| 宜兰市| 吕梁市| 密云县| 太原市| 呼和浩特市| 岢岚县| 徐州市| 略阳县| 邛崃市| 西丰县| 澎湖县| 泸定县| 龙井市| 福州市| 高清| 蒙阴县| 涿州市|