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

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

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

前言

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

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

1. @ConditionalOnProperty 基本用法

語法

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

參數(shù)說明:

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

2. 實戰(zhàn)場景

場景一:功能開關

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

示例:通過功能開關啟用日志增強功能

Step 1:配置文件定義開關

在 application.properties 文件中添加一個開關屬性:

feature.logging-enhancement.enabled=true

Step 2:實現(xiàn)日志增強功能

使用 @ConditionalOnProperty 來決定是否加載日志增強的 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("日志增強功能已啟用!");
        return "Logging Enhancement Activated";
    }
}

Step 3:測試

  • 當 feature.logging-enhancement.enabled=true 時,LoggingEnhancementConfig 類會被加載,控制臺會輸出:
    日志增強功能已啟用!
    
  • 當 feature.logging-enhancement.enabled=false 或未配置時,LoggingEnhancementConfig 類不會被加載。

場景二:環(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)境標識:

# 開發(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控制臺輸出:

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

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

3. 常見應用場景總結

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

4. 小結

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

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

最佳實踐

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

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

總結

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

相關文章

  • Java將數(shù)組轉換成字符串的四種方法總結

    Java將數(shù)組轉換成字符串的四種方法總結

    這篇文章主要給大家介紹了關于Java將數(shù)組轉換成字符串的四種方法,每種方法都有其適用的場景和優(yōu)缺點,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • 深入了解Java設計模式之UML類圖

    深入了解Java設計模式之UML類圖

    UML?即?Unified?Modeling?Language?統(tǒng)一建模語言,是用來設計軟件的可視化建模語言。本文就帶大家了解一下UML中類圖的定義與使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-11-11
  • Java如何獲取Cookie和Session

    Java如何獲取Cookie和Session

    Cookie?和?Session之間主要是通過?SessionId?關聯(lián)起來的,?SessionId是?Cookie?和?Session?之間的橋梁,這篇文章主要介紹了Java獲取Cookie和Session的方法,需要的朋友可以參考下
    2024-01-01
  • SpringBoot使用GTS的示例詳解

    SpringBoot使用GTS的示例詳解

    這篇文章主要介紹了SpringBoot使用GTS的示例詳解,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • Java實現(xiàn)爬蟲給App提供數(shù)據(jù)(Jsoup 網(wǎng)絡爬蟲)

    Java實現(xiàn)爬蟲給App提供數(shù)據(jù)(Jsoup 網(wǎng)絡爬蟲)

    這篇文章主要介紹了Java實現(xiàn)爬蟲給App提供數(shù)據(jù),即Jsoup 網(wǎng)絡爬蟲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 9個java數(shù)組常用操作實例

    9個java數(shù)組常用操作實例

    在本篇文章里小編給各位整理了關于java數(shù)組常用操作的實例以及相關的代碼,需要的朋友們跟著學習下。
    2019-07-07
  • Intellij IDEA遠程debug教程實戰(zhàn)和要點總結(推薦)

    Intellij IDEA遠程debug教程實戰(zhàn)和要點總結(推薦)

    這篇文章主要介紹了Intellij IDEA遠程debug教程實戰(zhàn)和要點總結(推薦),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java設計模塊系列之書店管理系統(tǒng)單機版(一)

    Java設計模塊系列之書店管理系統(tǒng)單機版(一)

    這篇文章主要為大家詳細介紹了Java單機版的書店管理系統(tǒng)設計模塊和思想第一章,感興趣的小伙伴們可以參考一下
    2016-08-08
  • java基于反射得到對象屬性值的方法

    java基于反射得到對象屬性值的方法

    這篇文章主要介紹了java基于反射得到對象屬性值的方法,結合實例形式分析了java基于反射獲取對象屬性值的相關實現(xiàn)方法與操作技巧,需要的朋友可以參考下
    2017-03-03
  • Java構建乘積數(shù)組的方法

    Java構建乘積數(shù)組的方法

    這篇文章主要為大家詳細介紹了Java構建乘積數(shù)組的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03

最新評論