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

Spring?Boot條件注解之@ConditionalOnProperty完全解析

 更新時(shí)間:2025年02月13日 10:53:03   作者:CodeDunkster  
這篇文章主要介紹了SpringBoot中的@ConditionalOnProperty注解,通過配置文件屬性值控制Bean或配置類的加載,實(shí)現(xiàn)功能開關(guān)和環(huán)境配置,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在 Spring Boot 項(xiàng)目中,有時(shí)候我們希望根據(jù)配置文件中的某個(gè)屬性值來決定是否啟用某個(gè)功能或加載某個(gè)組件。此時(shí),@ConditionalOnProperty 注解就可以發(fā)揮作用。它通過配置文件的屬性值控制 Bean 或配置類的加載,使得我們的程序更具靈活性。

本文將詳細(xì)介紹 @ConditionalOnProperty 的用法,并通過 功能開關(guān) 和 環(huán)境配置 兩個(gè)實(shí)際場景來展示它的強(qiáng)大之處。

1. @ConditionalOnProperty 基本用法

語法

@ConditionalOnProperty(
    prefix = "前綴",
    name = "屬性名",
    havingValue = "指定值",
    matchIfMissing = false
)

參數(shù)說明:

  • prefix:屬性的前綴部分。
  • name:屬性名稱。
  • havingValue:屬性的值與 havingValue 相等時(shí)條件成立(默認(rèn)不指定)。
  • matchIfMissing:如果屬性未定義,是否加載配置(默認(rèn) false,即未定義時(shí)不加載)。

2. 實(shí)戰(zhàn)場景

場景一:功能開關(guān)

在實(shí)際項(xiàng)目中,我們可能需要通過配置文件中的某個(gè)屬性來控制某個(gè)功能的啟用或禁用。比如,是否開啟定時(shí)任務(wù)、是否啟用某個(gè)服務(wù)等。

示例:通過功能開關(guān)啟用日志增強(qiáng)功能

Step 1:配置文件定義開關(guān)

在 application.properties 文件中添加一個(gè)開關(guān)屬性:

feature.logging-enhancement.enabled=true

Step 2:實(shí)現(xiàn)日志增強(qiáng)功能

使用 @ConditionalOnProperty 來決定是否加載日志增強(qiáng)的 Bean:

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnProperty(prefix = "feature.logging-enhancement", name = "enabled", havingValue = "true", matchIfMissing = false)
public class LoggingEnhancementConfig {

    @Bean
    public String loggingEnhancement() {
        System.out.println("日志增強(qiáng)功能已啟用!");
        return "Logging Enhancement Activated";
    }
}

Step 3:測試

  • 當(dāng) feature.logging-enhancement.enabled=true 時(shí),LoggingEnhancementConfig 類會(huì)被加載,控制臺(tái)會(huì)輸出:
    日志增強(qiáng)功能已啟用!
    
  • 當(dāng) feature.logging-enhancement.enabled=false 或未配置時(shí),LoggingEnhancementConfig 類不會(huì)被加載。

場景二:環(huán)境配置

在不同的環(huán)境(開發(fā)、測試、生產(chǎn))中,我們可能需要加載不同的配置。例如,開發(fā)環(huán)境下使用內(nèi)存數(shù)據(jù)庫,生產(chǎn)環(huán)境下使用 MySQL 數(shù)據(jù)庫。

示例:不同環(huán)境下選擇數(shù)據(jù)源

Step 1:配置文件

在 application.properties 中配置環(huán)境標(biāo)識(shí):

# 開發(fā)環(huán)境
spring.datasource.env=dev

# 生產(chǎn)環(huán)境
# spring.datasource.env=prod

Step 2:開發(fā)環(huán)境數(shù)據(jù)源配置

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
@ConditionalOnProperty(prefix = "spring.datasource", name = "env", havingValue = "dev")
public class DevDataSourceConfig {

    @Bean
    public DataSource devDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:testdb");
        dataSource.setUsername("sa");
        dataSource.setPassword("");
        System.out.println("開發(fā)環(huán)境:加載內(nèi)存數(shù)據(jù)庫");
        return dataSource;
    }
}

Step 3:生產(chǎn)環(huán)境數(shù)據(jù)源配置

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
@ConditionalOnProperty(prefix = "spring.datasource", name = "env", havingValue = "prod")
public class ProdDataSourceConfig {

    @Bean
    public DataSource prodDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/proddb");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        System.out.println("生產(chǎn)環(huán)境:加載 MySQL 數(shù)據(jù)庫");
        return dataSource;
    }
}

Step 4:測試

  • 開發(fā)環(huán)境spring.datasource.env=dev控制臺(tái)輸出:

    開發(fā)環(huán)境:加載內(nèi)存數(shù)據(jù)庫
    
  • 生產(chǎn)環(huán)境spring.datasource.env=prod控制臺(tái)輸出:

    生產(chǎn)環(huán)境:加載 MySQL 數(shù)據(jù)庫
    

3. 常見應(yīng)用場景總結(jié)

  • 功能開關(guān):動(dòng)態(tài)啟用或禁用某個(gè)功能模塊(如定時(shí)任務(wù)、監(jiān)控服務(wù)等)。
  • 環(huán)境配置:根據(jù)不同環(huán)境加載不同的配置(如數(shù)據(jù)源、日志級(jí)別等)。
  • 組件選擇:根據(jù)配置加載特定的第三方組件(如不同的緩存實(shí)現(xiàn) Redis/ehcache)。
  • 服務(wù)切換:實(shí)現(xiàn)備用服務(wù)或降級(jí)服務(wù)的自動(dòng)切換。

4. 小結(jié)

@ConditionalOnProperty 是 Spring Boot 中非常實(shí)用的條件注解,可以通過配置文件靈活地控制 Bean 和配置類的加載,避免不必要的資源浪費(fèi),并提高系統(tǒng)的可維護(hù)性。

通過功能開關(guān)和環(huán)境配置的示例,我們可以看到 @ConditionalOnProperty 如何讓代碼更清晰、配置更靈活,極大地滿足了開發(fā)者在不同場景下的需求。

最佳實(shí)踐

  • 配置文件中使用統(tǒng)一的前綴管理屬性,避免沖突。
  • 開關(guān)屬性的命名要清晰直觀,比如 feature.xxx.enabled。
  • 對(duì)于重要的功能開關(guān),可以結(jié)合文檔明確其作用和默認(rèn)值。

希望這篇博客能幫助你更好地掌握 @ConditionalOnProperty 的用法,讓你的 Spring Boot 項(xiàng)目更加靈活和可配置!

總結(jié)

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

相關(guān)文章

  • spring+springmvc+mybatis+maven入門實(shí)戰(zhàn)(超詳細(xì)教程)

    spring+springmvc+mybatis+maven入門實(shí)戰(zhàn)(超詳細(xì)教程)

    這篇文章主要介紹了spring+springmvc+mybatis+maven入門實(shí)戰(zhàn)(超詳細(xì)教程),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • java方法重載和參數(shù)類型自動(dòng)提升方式

    java方法重載和參數(shù)類型自動(dòng)提升方式

    這篇文章主要介紹了java方法重載和參數(shù)類型自動(dòng)提升方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 解決IDEA2020.2插件lombok報(bào)錯(cuò)問題(親測有效)

    解決IDEA2020.2插件lombok報(bào)錯(cuò)問題(親測有效)

    這篇文章主要介紹了解決IDEA2020.2插件lombok報(bào)錯(cuò)問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java視頻斷點(diǎn)上傳的實(shí)現(xiàn)示例

    Java視頻斷點(diǎn)上傳的實(shí)現(xiàn)示例

    斷點(diǎn)續(xù)傳指的是在下載或上傳時(shí),將下載或上傳任務(wù)人為的劃分為幾個(gè)部分,本文主要介紹了Java視頻斷點(diǎn)上傳的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • idea手動(dòng)執(zhí)行maven命令的三種實(shí)現(xiàn)方式

    idea手動(dòng)執(zhí)行maven命令的三種實(shí)現(xiàn)方式

    這篇文章主要介紹了idea手動(dòng)執(zhí)行maven命令的三種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(38)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(38)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Java實(shí)現(xiàn)TCP和UDP協(xié)議詳解

    Java實(shí)現(xiàn)TCP和UDP協(xié)議詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)TCP和UDP協(xié)議詳解,TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議)是兩種最常用的傳輸層協(xié)議,它們都用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù),但是它們之間有很多不同之處,需要的朋友可以參考下
    2023-07-07
  • SpringBoot上傳文件大小受限問題的解決辦法

    SpringBoot上傳文件大小受限問題的解決辦法

    最近有一次由于項(xiàng)目升級(jí)發(fā)現(xiàn)了一個(gè)上傳方面的問題,下面這篇文章主要給大家介紹了關(guān)于SpringBoot上傳文件大小受限問題的解決辦法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Java實(shí)現(xiàn)根據(jù)模板自動(dòng)生成新的PPT

    Java實(shí)現(xiàn)根據(jù)模板自動(dòng)生成新的PPT

    這篇文章主要介紹了如何利用Java代碼自動(dòng)生成PPT,具體就是查詢數(shù)據(jù)庫數(shù)據(jù),然后根據(jù)模板文件(PPT),將數(shù)據(jù)庫數(shù)據(jù)與模板文件(PPT),進(jìn)行組合一下,生成新的PPT文件。感興趣的可以了解一下
    2022-02-02
  • java運(yùn)行shell腳本方法示例

    java運(yùn)行shell腳本方法示例

    利用Runtime.execute方法,我們可以在Java程序中運(yùn)行Linux的Shell腳本,或者執(zhí)行其他程序
    2013-12-12

最新評(píng)論

宾阳县| 青海省| 武邑县| 罗江县| 汤原县| 黄石市| 博爱县| 磐石市| 沂南县| 巫山县| 高唐县| 微山县| 乌兰浩特市| 全南县| 陵川县| 车险| 大厂| 贵港市| 新余市| 托克逊县| 区。| 邛崃市| 宝山区| 正蓝旗| 万宁市| 凉城县| 革吉县| 南平市| 顺义区| 确山县| 东丽区| 鹰潭市| 平昌县| 来安县| 马山县| 青海省| 公主岭市| 中西区| 岑溪市| 斗六市| 铁力市|