亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

一、什么是@Profile

基本概念

@Profile 注解用于指定某個(gè) Bean 或配置類僅在指定的 Profile 環(huán)境下生效。它常用于區(qū)分開發(fā)、測(cè)試和生產(chǎn)環(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
  • 啟動(dòng)參數(shù):--spring.profiles.active=dev
  • SpringApplicationBuilder: .profiles("dev")

二、什么是@Conditional

基本概念

@Conditional 注解提供更通用的條件判斷能力。它的參數(shù)是一個(gè)實(shí)現(xiàn)了 Condition 接口的類,Spring 會(huì)調(diào)用該類的 matches 方法決定是否加載對(duì)應(yīng)的 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");
    }
}

三、兩者的對(duì)比

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

四、實(shí)戰(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 類時(shí),才創(chuàng)建 redisCacheManager Bean。

五、進(jìn)階@Conditional派生注解

Spring Boot 提供了多個(gè) @Conditional 的派生注解,簡(jiǎn)化了常見(jiàn)場(chǎng)景的條件配置:

@ConditionalOnProperty

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

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

@ConditionalOnMissingBean

作用:僅在指定 Bean 不存在時(shí)注冊(cè)當(dāng)前 Bean,用于提供默認(rèn)實(shí)現(xiàn)。

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

@ConditionalOnBean

作用:當(dāng) Spring 上下文中存在某個(gè) Bean 時(shí),才注入當(dāng)前 Bean。

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

@ConditionalOnClass

作用:當(dāng)類路徑下存在某個(gè)類時(shí)才加載 Bean,適合做組件自動(dòng)裝配。

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

這些注解極大簡(jiǎn)化了自動(dòng)配置的條件邏輯,是 Spring Boot 自動(dòng)裝配機(jī)制的核心支撐。

六、總結(jié)

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

在實(shí)際項(xiàng)目中,兩者可結(jié)合使用,構(gòu)建高度靈活、可配置的應(yīng)用架構(gòu),是 Spring 框架解耦和模塊控制的重要工具。

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

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

相關(guān)文章

  • 解析Java內(nèi)存分配和回收策略以及MinorGC、MajorGC、FullGC

    解析Java內(nèi)存分配和回收策略以及MinorGC、MajorGC、FullGC

    本節(jié)將會(huì)介紹一下:對(duì)象的內(nèi)存分配與回收策略;對(duì)象何時(shí)進(jìn)入新生代、老年代;MinorGC、MajorGC、FullGC的定義區(qū)別和觸發(fā)條件;還有通過(guò)圖示展示了GC的過(guò)程。
    2021-09-09
  • 一文帶你掌握J(rèn)ava?Future模式的靈活應(yīng)用

    一文帶你掌握J(rèn)ava?Future模式的靈活應(yīng)用

    Future模式,簡(jiǎn)單來(lái)說(shuō),就是一種能夠管理異步操作的方式,它可以讓咱們的程序在執(zhí)行一個(gè)耗時(shí)任務(wù)的同時(shí),還能繼續(xù)做其他事情,下面我們就來(lái)看看Future模式的具體應(yīng)用吧
    2024-01-01
  • SpringBoot應(yīng)用部署于外置Tomcat容器的方法

    SpringBoot應(yīng)用部署于外置Tomcat容器的方法

    這篇文章主要介紹了SpringBoot應(yīng)用部署于外置Tomcat容器的方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • Java如何使用Optional與Stream取代if判空邏輯(JDK8以上)

    Java如何使用Optional與Stream取代if判空邏輯(JDK8以上)

    這篇文章主要給大家介紹了關(guān)于Java如何使用Optional與Stream取代if判空邏輯(JDK8以上)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • JAVA面試題String產(chǎn)生了幾個(gè)對(duì)象

    JAVA面試題String產(chǎn)生了幾個(gè)對(duì)象

    這篇文章主要介紹了JAVA面試題 String s = new String("xyz");產(chǎn)生了幾個(gè)對(duì)象?,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 淺談springcloud常用依賴和配置

    淺談springcloud常用依賴和配置

    鑒于很多小伙伴常問(wèn)spring cloud常用依賴和配置,今天特地整理了本篇文章,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • java多線程:基礎(chǔ)詳解

    java多線程:基礎(chǔ)詳解

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下。
    2021-08-08
  • RestFul風(fēng)格 — 使用@PathVariable傳遞參數(shù)報(bào)錯(cuò)404的解決

    RestFul風(fēng)格 — 使用@PathVariable傳遞參數(shù)報(bào)錯(cuò)404的解決

    這篇文章主要介紹了RestFul風(fēng)格 — 使用@PathVariable傳遞參數(shù)報(bào)錯(cuò)404的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的方法

    Java實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,每一個(gè)鏈表都包含多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)又包含兩個(gè)部分,一個(gè)是數(shù)據(jù)域(儲(chǔ)存節(jié)點(diǎn)含有的信息),一個(gè)是引用域(儲(chǔ)存下一個(gè)節(jié)點(diǎn)或者上一個(gè)節(jié)點(diǎn)的地址),需要的朋友可以參考下
    2022-01-01
  • 一文了解MyBatis Plus批量數(shù)據(jù)插入功能

    一文了解MyBatis Plus批量數(shù)據(jù)插入功能

    mybatisPlus底層的新增方法是一條一條的新增的,下面這篇文章主要給大家介紹了MyBatis Plus批量數(shù)據(jù)插入功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09

最新評(píng)論