spring-core組件詳解——PropertyResolver屬性解決器
PropertyResolver屬性解決器,主要具有兩個(gè)功能:
通過(guò)propertyName屬性名獲取與之對(duì)應(yīng)的propertValue屬性值(getProperty)。
把${propertyName:defaultValue}格式的屬性占位符,替換為實(shí)際的值(resolvePlaceholders)。
注意:getProperty獲取的屬性值,全都是調(diào)用resolvePlaceholders進(jìn)行占位符替換后的值。
組件體系圖如下:

PropertyResolver接口:
該接口定義了組件所具有的所有功能。其一是通過(guò)key獲取對(duì)應(yīng)的value,當(dāng)獲取不到value時(shí),有3種選擇:返回null值、使用指定的默認(rèn)值或者拋出一個(gè)非法狀態(tài)異常。獲取到的value值默認(rèn)是String類(lèi)型,當(dāng)然也可以認(rèn)為指定一種類(lèi)型,這依賴(lài)于ConversionService進(jìn)行類(lèi)型轉(zhuǎn)換。
另外還有一個(gè)問(wèn)題:屬性值中可以包含${}格式的占位符,因此,接口添加了另一個(gè)功能就是替換屬性值中的占位符(注意:屬性名是不允許存在占位符的,就算存在,組件也不會(huì)當(dāng)作占位符進(jìn)行替換)。當(dāng)占位符無(wú)法替換時(shí),也有2種選擇:保持原樣或者拋出一個(gè)非法參數(shù)異常。具體接口如下:

ConfigurablePropertyResolver接口:
該接口定義了如何對(duì)組件本身進(jìn)行配置。如:剛剛提到獲取value時(shí)可以指定任意類(lèi)型,這依賴(lài)于ConversionService進(jìn)行類(lèi)型轉(zhuǎn)換,當(dāng)前接口就提供了對(duì)ConversionService的設(shè)置和獲取。另外,可以配置屬性占位符的格式,包括:占位符前綴(默認(rèn)為"${")、占位符后綴(默認(rèn)為"}")、占位符值分隔符(默認(rèn)為":",用于分隔propertyName和defaultValue)。組件還可以設(shè)置哪些屬性是必須存在的,還可以校驗(yàn)必須存在的屬性是否真的存在(不存在的話(huà)會(huì)拋出異常)。具體接口如下:

AbstractPropertyResolver類(lèi):
上述兩個(gè)接口的抽象實(shí)現(xiàn)類(lèi)。它實(shí)現(xiàn)了ConfigurablePropertyResolver接口的所有方法。關(guān)于PropertyResolver接口方法,還有3個(gè)getProperty方法需要子類(lèi)實(shí)現(xiàn)(其他重載方法均調(diào)用這3個(gè)方法):
String getProperty(String key); <T> T getProperty(String key, Class<T> targetType); <T> Class<T> getPropertyAsClass(String key, Class<T> targetType); /** * 當(dāng)前類(lèi)還額外定義了一個(gè)抽象方法,用于直接返回獲取到的value值(不進(jìn)行占位符替換)。 * 一般的getProperty方法默認(rèn)都會(huì)替換掉value值中的占位符后返回。 */ protected abstract String getPropertyAsRawString(String key); 至于替換屬性占位符,則借助2個(gè)PropertyPlaceholderHelper屬性占位符助手(工具類(lèi))對(duì)象完成, 這2個(gè)對(duì)象一個(gè)為嚴(yán)格模式,一個(gè)為非嚴(yán)格模式。
PropertySourcesPropertyResolver類(lèi):
該類(lèi)是體系中唯一的完整實(shí)現(xiàn)類(lèi)。它以PropertySources屬性源集合(內(nèi)部持有屬性源列表List<PropertySource>)為屬性值的來(lái)源,按序遍歷每個(gè)PropertySource,獲取到一個(gè)非null的屬性值則返回。
相關(guān)文章
SpringBoot2底層注解@Configuration配置類(lèi)詳解
這篇文章主要為大家介紹了SpringBoot2底層注解@Configuration配置類(lèi)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
java中設(shè)計(jì)模式(多例)的實(shí)例詳解
這篇文章主要介紹了java中設(shè)計(jì)模式(多例)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09
Java實(shí)現(xiàn)手寫(xiě)線(xiàn)程池實(shí)例并測(cè)試詳解
這篇文章主要來(lái)模擬一下線(xiàn)程池和工作隊(duì)列的流程,以及編寫(xiě)代碼和測(cè)試類(lèi)進(jìn)行測(cè)試。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02
Spring Boot創(chuàng)建可執(zhí)行jar包的實(shí)例教程
這篇文章主要介紹了Spring Boot創(chuàng)建可執(zhí)行jar包的實(shí)例教程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
java實(shí)現(xiàn)堆的操作方法(建堆,插入,刪除)
下面小編就為大家分享一篇java實(shí)現(xiàn)堆的操作方法(建堆,插入,刪除),具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-12-12
eclipse實(shí)現(xiàn)DSA數(shù)字簽名
這篇文章主要為大家詳細(xì)介紹了eclipse實(shí)現(xiàn)DSA數(shù)字簽名算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
JAVA8發(fā)送帶有Body的HTTP GET請(qǐng)求
本文主要介紹了JAVA8發(fā)送帶有Body的HTTP GET請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
java 利用HttpClient PostMethod提交json數(shù)據(jù)操作
這篇文章主要介紹了java 利用HttpClient PostMethod提交json數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01

