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
精品資料,超贊福利,免費領
微信掃碼/長按辨識 添加【技術交流群】
群內每天分享精品學習資料
最近開發整理了一個用於速刷面試題的小程式;其中收錄了上千道常見面試題及答案(包含基礎、並行、JVM、MySQL、Redis、Spring、SpringMVC、SpringBoot、SpringCloud、訊息佇列等多個型別),歡迎您的使用。
👇👇
👇點選"閱讀原文",獲取更多資料(持續更新中)