PropertyResolver屬性解決器,主要具有兩個功能:
通過propertyName屬性名獲取與之對應的propertValue屬性值(getProperty)。
把${propertyName:defaultValue}格式的屬性占位符,替換為實際的值(resolvePlaceholders)。
注意:getProperty獲取的屬性值,全都是調用resolvePlaceholders進行占位符替換后的值。
組件體系圖如下:
PropertyResolver接口:
該接口定義了組件所具有的所有功能。其一是通過key獲取對應的value,當獲取不到value時,有3種選擇:返回null值、使用指定的默認值或者拋出一個非法狀態異常。獲取到的value值默認是String類型,當然也可以認為指定一種類型,這依賴于ConversionService進行類型轉換。
另外還有一個問題:屬性值中可以包含${}格式的占位符,因此,接口添加了另一個功能就是替換屬性值中的占位符(注意:屬性名是不允許存在占位符的,就算存在,組件也不會當作占位符進行替換)。當占位符無法替換時,也有2種選擇:保持原樣或者拋出一個非法參數異常。具體接口如下:
ConfigurablePropertyResolver接口:
該接口定義了如何對組件本身進行配置。如:剛剛提到獲取value時可以指定任意類型,這依賴于ConversionService進行類型轉換,當前接口就提供了對ConversionService的設置和獲取。另外,可以配置屬性占位符的格式,包括:占位符前綴(默認為"${")、占位符后綴(默認為"}")、占位符值分隔符(默認為":",用于分隔propertyName和defaultValue)。組件還可以設置哪些屬性是必須存在的,還可以校驗必須存在的屬性是否真的存在(不存在的話會拋出異常)。具體接口如下:
AbstractPropertyResolver類:
上述兩個接口的抽象實現類。它實現了ConfigurablePropertyResolver接口的所有方法。關于PropertyResolver接口方法,還有3個getProperty方法需要子類實現(其他重載方法均調用這3個方法):
1
2
3
4
5
6
7
8
9
10
|
String getProperty(String key); <T> T getProperty(String key, Class<T> targetType); <T> Class<T> getPropertyAsClass(String key, Class<T> targetType); /** * 當前類還額外定義了一個抽象方法,用于直接返回獲取到的value值(不進行占位符替換)。 * 一般的getProperty方法默認都會替換掉value值中的占位符后返回。 */ protected abstract String getPropertyAsRawString(String key); 至于替換屬性占位符,則借助 2 個PropertyPlaceholderHelper屬性占位符助手(工具類)對象完成, 這 2 個對象一個為嚴格模式,一個為非嚴格模式。 |
PropertySourcesPropertyResolver類:
該類是體系中唯一的完整實現類。它以PropertySources屬性源集合(內部持有屬性源列表List<PropertySource>)為屬性值的來源,按序遍歷每個PropertySource,獲取到一個非null的屬性值則返回。