首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Core 核心組件深度解析:PropertyResolver 屬性處理器

     編輯:Java 相關知識

Spring Core 核心組件深度解析:PropertyResolver 屬性處理器

在 Spring 框架的核心模組 spring-core 中,PropertyResolver 介面扮演著關鍵角色,它是屬性解析與占位符替換的核心抽象。本文將系統梳理其架構設計、核心介面與實現類,幫助開發者深入理解 Spring 環境屬性管理的底層機制。

核心功能:兩大核心職責

PropertyResolver 主要提供以下兩項基礎能力:

  1. 屬性值獲取:透過屬性名 propertyName 獲取對應的 propertyValue(getProperty 方法族)。
  2. 佔位符解析:將 ${propertyName:defaultValue} 格式的屬性佔位符替換為實際值(resolvePlaceholders)。

注意: getProperty 獲取的屬性值,預設都會經過 resolvePlaceholders 進行佔位符替換後再返回。

介面體系架構

1. PropertyResolver 介面:功能定義基石

該介面定義了組件的所有核心功能:

  • 鍵值獲取:根據 key 獲取 value。若獲取不到,提供三種策略:返回 null、使用指定預設值、或拋出異常。
  • 類型轉換:獲取的值預設為 String,可指定目標類型,依賴 ConversionService 進行轉換。
  • 佔位符替換:屬性值中可能包含 ${} 佔位符,介面提供替換功能。屬性名本身不允許包含佔位符,即使存在也不會被解析。佔位符無法解析時,可選保留原樣或拋出異常。

2. ConfigurablePropertyResolver 介面:配置與擴展

定義如何對組件自身進行配置:

  • ConversionService 管理:設置/獲取用於類型轉換的 ConversionService。
  • 佔位符格式自定義:前綴(預設 ${)、後綴(預設 })、值分隔符(預設 :,用於分隔 propertyName 和 defaultValue)。
  • 必填屬性驗證:設置哪些屬性為必填,並驗證其是否存在(不存在則拋出異常)。

3. AbstractPropertyResolver 抽象類:骨幹實現

實現了上述兩個介面的大部分方法。對於 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 助手對象:一個嚴格模式,一個非嚴格模式。

4. PropertySourcesPropertyResolver:唯一完整實現類

系統中唯一的完整實現類。它以 PropertySources(持有 List<PropertySource>)作為屬性值來源,順序遍歷每個 PropertySource,獲取到第一個非 null 的屬性值即返回。

總結

PropertyResolver 體系通過清晰的介面分層(功能定義、配置管理、骨幹實現、具體實現),實現了屬性獲取、類型轉換、佔位符解析、必填驗證等核心功能。理解這一體系,有助於深入掌握 Spring Environment、@Value 注解、配置文件屬性注入等上層功能的底層原理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved