【死磕 Spring】----- IOC 之解析 bean 標籤:constructor-arg、property 子元素
上篇部落格(ofollow,noindex">【死磕 Spring】—– IOC/">IOC 之解析 bean 標籤:meta、lookup-method、replace-method )分析了 meta 、 lookup-method、replace-method 三個子元素,這篇部落格分析 constructor-arg 、property、qualifier 三個子元素。
constructor-arg 子元素
舉個小栗子:
StudentService 定義一個建構函式,配置檔案中使用 constructor-arg 元素對其配置,該元素可以實現對 StudentService 自動尋找對應的建構函式,並在初始化的時候將值當做引數進行設定。parseConstructorArgElements()
方法完成 constructor-arg 子元素的解析。
遍歷所有子元素,如果為 constructor-arg 則呼叫parseConstructorArgElement()
進行解析。
首先獲取 index、type、name 三個屬性值,然後根據是否存在 index 來區分。其實兩者邏輯都差不多,總共分為如下幾個步驟(以有 index 為例):
-
構造 ConstructorArgumentEntry 物件並將其加入到 ParseState 佇列中。ConstructorArgumentEntry 表示建構函式的引數。
-
呼叫
parsePropertyValue()
解析 constructor-arg 子元素,返回結果值 -
根據解析的結果值構造
ConstructorArgumentValues.ValueHolder
例項物件 -
將 type、name 封裝到
ConstructorArgumentValues.ValueHolder
中,然後將 ValueHolder 例項物件新增到 indexedArgumentValues 中。
無 index 的處理邏輯差不多,只有幾點不同:構造 ConstructorArgumentEntry 物件時是呼叫無參建構函式;最後是將 ValueHolder 例項新增到 genericArgumentValues 中。
parsePropertyValue()
對子元素進一步解析。
-
提取 constructor-arg 子元素的 ref 和 value 的屬性值,對其進行判斷,以下兩種情況是不允許存在的
-
ref 和 value 屬性同時存在
-
存在 ref 或者 value 且又有子元素
-
若存在 ref 屬性,則獲取其值並將其封裝進 RuntimeBeanReference 例項物件中
-
若存在 value 屬性,則獲取其值並將其封裝進 TypedStringValue 例項物件中
-
如果子元素不為空,則呼叫
parsePropertySubElement()
進行子元素進一步處理
對於 constructor-arg 子元素的巢狀子元素,需要呼叫parsePropertySubElement()
進一步處理。
上面對各個子類進行分類處理,詳細情況如果各位有興趣可以移步原始碼進行深一步的探究。
property 子元素
我們一般使用如下方式來使用 property 子元素。
對於 property 子元素的解析,Spring 呼叫parsePropertyElements()
。如下:
和 constructor-arg 子元素差不多,同樣是提取所有的 property 的子元素,然後呼叫parsePropertyElement()
進行分析。
與解析 constructor-arg 子元素步驟差不多。呼叫parsePropertyValue()
解析子元素屬性值,然後根據該值構造 PropertyValue 例項物件並將其新增到 BeanDefinition 中的 MutablePropertyValues 中。
原文釋出時間為:2018-09-26
本文作者:Java技術驛站