在 Spring 框架的核心模組 spring-core 中,PropertyResolver 介面扮演著關鍵角色,它是屬性解析與占位符替換的核心抽象。本文將系統梳理其架構設計、核心介面與實現類,幫助開發者深入理解 Spring 環境屬性管理的底層機制。
PropertyResolver 主要提供以下兩項基礎能力:
propertyName 獲取對應的 propertyValue(getProperty 方法族)。${propertyName:defaultValue} 格式的屬性佔位符替換為實際值(resolvePlaceholders)。注意: getProperty 獲取的屬性值,預設都會經過 resolvePlaceholders 進行佔位符替換後再返回。
該介面定義了組件的所有核心功能:
ConversionService 進行轉換。${} 佔位符,介面提供替換功能。屬性名本身不允許包含佔位符,即使存在也不會被解析。佔位符無法解析時,可選保留原樣或拋出異常。定義如何對組件自身進行配置:
ConversionService。${)、後綴(預設 })、值分隔符(預設 :,用於分隔 propertyName 和 defaultValue)。實現了上述兩個介面的大部分方法。對於 PropertyResolver 介面,仍有 3 個核心 getProperty 方法需由子類實現(其他重載方法均委託這 3 個):
String getProperty(String key);
<T> T getProperty(String key, Class<T> targetType);
<T> Class<T> getPropertyAsClass(String key, Class<T> targetType);
/**
* 額外定義的抽象方法,直接返回獲取到的原始值(不進行佔位符解析)。
* 普通 getProperty 方法預設都會解析佔位符後返回。
*/
protected abstract String getPropertyAsRawString(String key);
佔位符解析委託給兩個 PropertyPlaceholderHelper 助手對象:一個嚴格模式,一個非嚴格模式。
系統中唯一的完整實現類。它以 PropertySources(持有 List<PropertySource>)作為屬性值來源,順序遍歷每個 PropertySource,獲取到第一個非 null 的屬性值即返回。
PropertyResolver 體系通過清晰的介面分層(功能定義、配置管理、骨幹實現、具體實現),實現了屬性獲取、類型轉換、佔位符解析、必填驗證等核心功能。理解這一體系,有助於深入掌握 Spring Environment、@Value 注解、配置文件屬性注入等上層功能的底層原理。