org.springframework.core.env.PropertiesPropertySource 類詳解
1. 基本概述
- 類路徑:
org.springframework.core.env.PropertiesPropertySource
- 繼承關系: 繼承自
PropertySource<Properties>
,實現PropertySource
接口。 - 作用: 將 Java Properties 對象(如
application.properties
文件內容)封裝為 Spring 環境(Environment)中的屬性源,支持通過鍵名獲取屬性值。
2. 核心功能
- Properties 文件加載: 將
Properties
對象(如從文件、資源或內存中加載的鍵值對)作為配置屬性源。 - 屬性訪問: 支持通過
getProperty()
方法直接讀取屬性值。 - 嵌套屬性支持: Spring 的
PropertyResolver
會自動解析嵌套鍵(如user.name
)。
3. 關鍵方法
-
構造方法:
public PropertiesPropertySource(String name, Properties source)
- name: 屬性源的唯一名稱(如
"application-properties"
)。 - source: 包含配置鍵值對的
Properties
對象。
- name: 屬性源的唯一名稱(如
-
常用方法:
containsProperty(String name)
: 檢查是否存在指定鍵的屬性。getProperty(String name)
: 根據鍵名獲取屬性值(返回Object
類型,通常為String
)。
4. 典型應用場景
- 加載傳統 Properties 文件: 如
application.properties
或自定義配置文件。 - 自定義配置加載: 在啟動時或運行時動態加載 Properties 文件。
- 與 Spring Boot 集成: Spring Boot 默認會自動加載
application.properties
并注冊為PropertiesPropertySource
。
5. 使用示例
// 1. 加載 Properties 文件
Properties props = new Properties();
props.load(new FileInputStream("config.properties")); // 例如文件內容:app.version=1.0.0// 2. 創建 PropertiesPropertySource
PropertiesPropertySource propsSource = new PropertiesPropertySource("customConfig", props);// 3. 將屬性源添加到 Environment
ConfigurableEnvironment environment = ... ; // 從 Spring 上下文獲取
environment.getPropertySources().addFirst(propsSource); // 優先級最高// 4. 讀取屬性
String version = environment.getProperty("app.version"); // 輸出 "1.0.0"
6. 注意事項
-
編碼問題:
- Properties 文件默認使用 ISO-8859-1 編碼,若包含中文需顯式指定 UTF-8:
props.load(new InputStreamReader(new FileInputStream("config.properties"), "UTF-8"));
- Properties 文件默認使用 ISO-8859-1 編碼,若包含中文需顯式指定 UTF-8:
-
類型轉換:
- 默認返回
String
類型,需通過Environment
的getProperty(name, Class<T>)
進行類型轉換。
- 默認返回
-
屬性覆蓋:
- 通過
addFirst()
或addLast()
控制優先級(先添加的屬性源可能被后添加的覆蓋)。
- 通過
7. 與 MapPropertySource/SimpleCommandLinePropertySource 的區別
特性 | PropertiesPropertySource | MapPropertySource | SimpleCommandLinePropertySource |
---|---|---|---|
數據來源 | Properties 對象(如文件加載) | 內存中的 Map 對象 | 命令行參數(如 --key=value ) |
動態修改 | 不支持(除非重新加載 Properties) | 取決于底層 Map 是否可變 | 支持(通過 addProperty() 等方法) |
默認解析規則 | 支持 Properties 格式(如 key=value ) | 直接使用 Map 的鍵值對 | 自動解析命令行參數格式 |
典型用途 | 加載傳統 Properties 文件 | 單元測試或內存配置 | 應用啟動時讀取命令行參數 |
8. 常見問題
- Q: 如何加載多個 Properties 文件?
- A: 可多次創建
PropertiesPropertySource
實例并添加到 Environment,或通過@PropertySource
注解指定多個文件路徑。
- A: 可多次創建
- Q: 屬性鍵名區分大小寫嗎?
- A: 默認不區分大小寫,可通過
Properties
的setIgnoreCase(true)
修改。
- A: 默認不區分大小寫,可通過
- Q: 如何處理 Properties 文件中的特殊字符(如
#
)?- A: 使用轉義符(如
\\#
),或確保鍵名不包含 Properties 文件的元字符(如#
表示注釋)。
- A: 使用轉義符(如
9. 與 Spring Boot 的集成
- 自動配置: Spring Boot 默認會自動加載
application.properties
并注冊為PropertiesPropertySource
。 - 自定義配置: 通過
@PropertySource
注解在配置類中指定額外的 Properties 文件:@Configuration @PropertySource("classpath:custom-config.properties") public class AppConfig { ... }