當前位置: 妍妍網 > 碼農

解鎖 SpringBoot 的強大配置功能

2024-02-28碼農

來源|blog.csdn.net/Mrxiao_bo/article/details/133637337

1前言

在當今的軟體開發世界中,配置管理是至關重要的一部份。Spring框架為我們提供了多種配置方式,其中 @ConfigurationProperties @PropertySources 是強大的工具,可以幫助我們輕松管理應用程式的配置資訊。

本部落格將深入探討這兩個關鍵註解,介紹它們的用途以及如何在Spring應用程式中使用它們。無論你是新手還是經驗豐富的開發者,這篇部落格都將為你提供有關配置檔管理的深入知識,幫助你編寫更具可維護性和可延伸性的程式碼。

2什麽是@ConfigurationProperties和@PropertySources

@ConfigurationProperties @PropertySources 都是與內容配置相關的註解,用於在 Spring 應用程式中管理和載入配置資訊。

@ConfigurationProperties:

@ConfigurationProperties 是 Spring Boot 中的一個註解,用於將配置檔中的內容值繫結到 Java Bean 上。通常,這個註解用於將外部內容檔中的內容值對映到應用程式的配置類中,以便在整個應用程式中方便地存取和使用這些內容。

這個註解通常與 @Configuration @Component 一起使用,以將配置內容繫結到一個特定的 Java Bean。透過在類上使用 @ConfigurationProperties ,您可以將內容檔中的鍵與 Java Bean 的欄位或內容進行對映。

範例:

@Configuration
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
private String name;
private String version;
// getters and setters
}

在上述範例中, @ConfigurationProperties 註解將以 myapp 字首開頭的內容對映到 MyAppProperties 類的欄位中。

@PropertySources:

@PropertySources 是 Spring Framework 中的註解,用於指定多個內容源,以便在 Spring 應用程式中解析內容。每個內容源可以是一個內容檔,用於儲存配置資訊。與 @PropertySource 類似, @PropertySources 允許您在多個地方定義內容源,以便將配置資訊分散在不同的檔中。

這個註解通常與 @Configuration 一起使用,以將多個內容源引入 Spring 應用程式的環境中。

範例:

@Configuration
@PropertySources({
@PropertySource(" classpath:application.properties"),
@PropertySource(" classpath:custom.properties")
})
public class AppConfig {
// 這裏可以註入和使用從內容檔載入的配置內容
}

在上述範例中, @PropertySources 註解指定了兩個內容源,分別是 application.properties custom.properties

總結:

  • @ConfigurationProperties 主要用於將外部內容對映到 Java Bean,適用於 Spring Boot 應用程式。

  • @PropertySources 主要用於指定多個內容源,以在 Spring 應用程式中載入配置內容,適用於標準的 Spring 應用程式。

  • 3@ConfigurationProperties的使用

    在 Spring Boot 應用程式中,您可以使用 @ConfigurationProperties 註解來繫結配置內容,並將其註入到 Spring Bean 中。以下是如何執行這些步驟的詳細說明:

    步驟 1: 建立 Java POJO 類

    首先,建立一個普通的 Java 類(POJO),該類的內容將對映到您的配置內容。這個類通常被用於儲存和操作配置內容的值。確保為內容提供適當的 getter 和 setter 方法。

    @ConfigurationProperties(prefix = "myapp")
    public class MyAppProperties {
    private String name;
    private String version;
    // 省略建構函式、getter 和 setter 方法
    }

    在上面的範例中, @ConfigurationProperties 註解指定了一個字首 "myapp",這意味著配置檔中的內容鍵應以 "myapp" 開頭。例如, myapp.name myapp.version

    步驟 2: 配置類

    接下來,建立一個配置類,用於載入配置內容並將它們繫結到您的 Java POJO 類。通常,這個配置類應該使用 @Configuration 註解進行標記。

    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    @Configuration
    @EnableConfigurationProperties(MyAppProperties. class)
    public class AppConfig {
    }

    @EnableConfigurationProperties 註解用於啟用對 MyAppProperties 類的配置內容繫結。

    步驟 3: 配置檔

    application.properties application.yml 檔中,添加與您的配置內容相關的內容鍵和值。確保它們以與 @ConfigurationProperties 註解中指定的字首匹配的方式進行命名。

    myapp.name=My Spring Boot App
    myapp.version=1.0

    或者,使用 YAML 格式:

    myapp:
    name: My Spring Boot App
    version: 1.0

    步驟 4: 註入配置內容

    最後,在您的 Spring Bean 中註入 MyAppProperties 類,以存取配置內容的值。您可以透過建構函式註入或使用 @Autowired 註解進行註入。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    @Service
    public class MyService {
    private final MyAppProperties myAppProperties;
    @Autowired
    public MyService(MyAppProperties myAppProperties) {
    this.myAppProperties = myAppProperties;
    }
    public void doSomething() {
    String appName = myAppProperties.getName();
    String appVersion = myAppProperties.getVersion();
    // 使用配置內容進行操作
    System.out.println("App Name: " + appName);
    System.out.println("App Version: " + appVersion);
    }
    }


    現在,您的 MyService Bean 可以存取透過 @ConfigurationProperties 註解繫結的配置內容。

    透過上述步驟,您可以成功地在 Spring Boot 應用程式中使用 @ConfigurationProperties 註解將配置內容繫結到 Java POJO 類,並將其註入到 Spring Bean 中,以便在應用程式中使用這些內容的值。這種方式使配置內容的管理和使用變得非常方便。

    4@PropertySources的使用

    在 Spring Boot 中,通常使用 @PropertySource 註解和 application.properties(或 application.yml)檔來管理應用程式的配置內容。雖然 @PropertySources 註解在標準 Spring 應用程式中更常見,但在 Spring Boot 中,通常使用 @PropertySource 和預設的 application.properties 或 application.yml 更為常見。

    不過,我可以提供一個範例,演示如何在 Spring Boot 中使用 @PropertySources 註解來指定多個內容源。

    以下是一個範例:

  • 建立一個 Spring Boot 計畫。

  • 建立一個配置類,例如 AppConfig.java,並使用 @PropertySources 註解來指定多個內容源。

  • import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.context.annotation.PropertySources;
    @Configuration
    @PropertySources({
    @PropertySource(" classpath:default.properties"), // 預設內容源
    @PropertySource(" classpath:custom.properties") // 自訂內容源
    })
    public class AppConfig {
    }

    在上述範例中,我們在 AppConfig 類上使用 @PropertySources 註解,並指定了兩個內容源,分別是 default.properties custom.properties 。這兩個內容源位於類路徑下,可以包含不同的配置內容。

    建立內容檔 default.properties custom.properties 並放置在 src/main/resources 目錄下。範例 default.properties 檔內容如下:

    app.name=My Spring Boot App (Default)
    app.version=1.0 (Default)

    範例 custom.properties 檔內容如下:

    app.name=My Custom Spring Boot App

    建立一個服務類,例如 MyService.java,並使用 @Value 註解來註入內容。

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    @Service
    public class MyService {
    @Value("${app.name}")
    private String appName;
    @Value("${app.version}")
    private String appVersion;
    public String getAppInfo() {
    return"App Name: " + appName + ", App Version: " + appVersion;
    }
    }


    在上述範例中,我們使用 @Value 註解來註入內容 app.name 和 app.version,這些內容的值將從內容源中獲取。

    建立一個控制器類,例如 MyController.java,並在其中使用 MyService 來獲取內容值並返回給客戶端。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    @RestController
    public class MyController {
    private final MyService myService;
    @Autowired
    public MyController(MyService myService) {
    this.myService = myService;
    }
    @GetMapping("/app-info")
    public String getAppInfo() {
    return myService.getAppInfo();
    }
    }


    啟動應用程式,並存取 /app-info 路徑,您將看到根據不同內容源獲取的應用程式資訊。

    在這個範例中,我們使用了 @PropertySources 註解來指定多個內容源,並在服務類中使用 @Value 註解來註入內容。這使得應用程式能夠根據內容源的不同而獲取不同的內容值。

    不過需要註意,在 Spring Boot 中,通常更常見的做法是使用預設的 application.properties(或 application.yml)檔以及 @ConfigurationProperties 註解來管理配置內容。

    5@PropertySources與@ConfigurationProperties的區別

    @PropertySources 註解是 Spring 框架中用於指定多個內容源的註解。它的主要作用是允許您在 Spring 應用程式中定義多個內容源,以便在不同位置或不同配置檔中儲存和管理配置內容。這有助於將配置資訊分散在多個檔中,使應用程式更加模組化和可維護。

    下面詳細介紹 @PropertySources 註解的作用以及與 @ConfigurationProperties 的關系:

    @PropertySources 註解的作用:

  • 指定多個內容源: @PropertySources 允許您在一個配置類中指定多個內容源,每個內容源對應一個內容檔。這些內容源可以包含應用程式的配置資訊,如資料庫連線參數、日誌級別、伺服端口等。

  • 模組化配置: 透過將配置資訊分散在多個內容檔中,您可以將應用程式的配置模組化,使每個模組負責自己的配置。這使得程式碼更易於維護和理解,特別是在大型應用程式中。

  • 環境適應力: 您可以為不同的環境(如開發、測試、生產)或不同的配置需求定義不同的內容源。這使得應用程式能夠在不同環境中使用不同的配置,而不必修改程式碼。

  • 內容源優先級: 如果存在多個內容源,Spring 將按照它們在 @PropertySources 註解中的順序來解析內容。這意味著後面的內容源可以覆蓋前面的內容源中的內容值。

  • 與 @ConfigurationProperties 的關系:

  • @PropertySources @ConfigurationProperties 都用於處理配置內容,但它們的關註點和使用方式不同。

  • @PropertySources 主要用於定義內容源,將配置資訊儲存在不同的內容檔中,並在不同環境或模組之間共享配置。它不直接與 Java Bean 繫結。

  • @ConfigurationProperties 主要用於將配置內容繫結到 Java Bean 上。它通常與 @Configuration @Component 註解一起使用,以將外部內容檔中的內容值對映到一個特定的 Java Bean。

  • 通常情況下,您會使用 @PropertySources 來定義內容源,然後使用 @ConfigurationProperties 來將內容源中的內容值繫結到 Java Bean,以便在整個應用程式中使用這些內容。這兩個註解可以協同工作,但它們的功能不同,各自有其用途。

  • 綜上所述, @PropertySources 註解用於管理多個內容源,而 @ConfigurationProperties 註解用於將配置內容繫結到 Java Bean。它們可以一起使用,以實作更靈活和模組化的配置管理。

    >>

    END

    精品資料,超贊福利,免費領

    微信掃碼/長按辨識 添加【技術交流群

    群內每天分享精品學習資料

    最近開發整理了一個用於速刷面試題的小程式;其中收錄了上千道常見面試題及答案(包含基礎並行JVMMySQLRedisSpringSpringMVCSpringBootSpringCloud訊息佇列等多個型別),歡迎您的使用。

    👇👇

    👇點選"閱讀原文",獲取更多資料(持續更新中