1. 程式人生 > >PropertyPlaceHolderConfigurer中的location是不是用錯了?

PropertyPlaceHolderConfigurer中的location是不是用錯了?

本文由作者張遠道授權網易雲社群釋出。


spring中常用PropertyPlaceHolderConfigurer來讀取properties配置檔案的配置資訊。常用的配置方式有兩種,一種是使用location


<bean id="property" >
    <property="
location" value="classpath:myproperty.propeties"/>
</bean>


 另一種是使用locations


<bean id="property" 

<property="
locations">
<list>
<value>classpath:myproperty.propeties</value>
<value>classpath:myproperty1.properties</value>
</list>
</property>
</bean>


檢視PropertyPlaceHolderConfigurer的原始碼發現,整個PropertyPlaceHolderConfigurer的繼承樹中都沒有location整個屬性,僅僅只有locations這個屬性。如下圖所示。

1a3090e3-f86b-4ce7-8c2e-6de17ff57edf

因此,認為既然沒有location這個屬性,那使用時是不是不正確。但是仔細看看發現了PropertiesLoaderSupport中有setLocation()方法。

而檢視spring有關依賴注入的原始碼:

aaaa06a4-d3b9-4a85-abc6-5dd4b3a2c32e

即獲得property對應的setter方法,以及property對應的值,然後通過反射,呼叫該方法即可。可以看出,不要求類的定義中真正包含改屬性,只要對應的setter方法被呼叫即可以。因此,ioc容器從xml配置中讀到屬性為location的值,然後獲得location對應的setter方法,即setLocation,然後通過反射,將location的值傳入了setLocation中。如下圖。

62865004-4563-4acc-ad60-7d31e9e5cc77

結論:location屬性沒有使用錯,而是spring根據反射呼叫setLocation方法,將location賦值給了locations了而已。


免費領取驗證碼、內容安全、簡訊傳送、直播點播體驗包及雲伺服器等套餐

更多網易技術、產品、運營經驗分享請訪問網易雲社群


相關文章:
【推薦】 JVM記憶體回收區域+物件存活的判斷+引用型別+垃圾回收執行緒
【推薦】 【你離矽谷只差一步】網易中國創業家大賽專案火熱徵集中
【推薦】 Hive中文註釋亂碼解決方案