sping原始碼分析之properties操作

2021-09-30 05:13:45 字數 3083 閱讀 8288

spring

原始碼的時間也有很長一段時間了,對其中

bean

的注入也有一定的了解。總想對這一段時間的學習經歷做出總結,又不知道從何處開始。也看了從主要脈絡開始寫,本人也看了計文柯老師編寫的《

spring

技術內幕》,覺得將的很生動,就是對於乙個剛學習的人來說有點深奧。想從一些基礎的東西開始慢慢的解釋

spring

的bean

spring

核心的人提供一些幫助。也希望各位老鳥看了之後提出寶貴的建議。 先從

spring

的bean

的屬性操作開始吧。 一

bean

的properties

的操作特性

1 properties

操作的整體的結構圖

這是我整理出來的

bean

相關屬性的操作介面圖。從這個圖中我們可以清晰的看出對於

bean

屬性相關操作的功能。在最上面的

propertyaccessor

介面提供了對於

bean

屬性的取值,賦值等基本的操作,並且定義了屬性常用的分割符「

.」,「

[」,「

]」等。

typeconverter

介面提供了在需要的情況下對一些型別的值,進行轉換和封裝。這些實際性的操作在我們給

bean

的賦值的時候都會用到。例如

在我們的引用中,我們有乙個屬性

start

是int

型別的,在

spring

的配置檔案中

給這個屬性賦

21的值。我們在這設定的是乙個字串型別的值,在

bean

的初始化的時候就需要同過實現

convertifnecessary

的方法將字元型串型別轉化成

int型別。

propertyeditorregistry

介面提供了一些對屬性編輯器註冊和查詢的方法。而這些方法的具體實現是在

propertyeditorregistrysupport

類中實現的。

configurablepropertyaccessor

介面只是繼承了上面的的三個介面。方便在後面實現類去做實現的時候只用去實現這個統一介面。同時也增加了在對屬性賦值的時候是否去提取他以前值的標誌介面

介面繼承了

configurablepropertyaccessor

介面,同時還新增了一些

bean

的型別,例項新增獲取等操作,從而完成了乙個

bean

物件的初步的服裝。

下面對這些介面的實現類做主要的分析。 u

propertyeditorregistrysupport

propertyeditorregistrysupport

的類實現了各種型別的的屬性的編譯器.

這個類裡面定義幾種型別的型別編輯器的儲存容器,是否啟用一些通用屬性的編輯器。 通過

getdefaulteditor

的方法來獲取預設型別的屬性的編輯器.在

defaulteditors

容器中儲存的是屬性的型別,各種型別的編輯器的。 通過

doregisterdefaulteditors

來註冊了

64中預設型別的編輯器。這些編輯器都是我們在編碼過程中常見的型別,例如

cahr,class,string

,list

等等。

private

void

doregisterdefaulteditors() }

/**

*copy

thedefault

editors

registered

inthis

instance

tothe

given

target

registry. *

@param

target

thetarget

registry

tocopyto

*/ protected

void

copydefaulteditorsto(propertyeditorregistrysupport target)

註冊乙個需要用到的屬性型別編輯器

這個方法需要兩個引數,屬性的型別和能對這個型別做出處理的屬性編輯器。他是通過

下面的方法的來實現主體註冊的

註冊共享的屬性編輯器

通過屬性的路徑或者屬性的型別來獲取屬性的編輯器

通過屬性的型別來獲取屬性的編輯器。 u

類是對bean

的封裝類的

的實現,主要是設定

bean

的屬性值,獲取

bean

的型別的等操作。

下面是例項化的

註冊預設的屬性編輯器,呼叫的是從

propertyeditorregistrysupport

中整合過來的。

獲取到某個屬性的

propertydescriptor,

主要是通過呼叫

getpropertydescriptorinternal

的方法來實現,這個方法是獲取到當前物件的

class

類的所有屬性的

propertydescriptor

快取容器,從容器中查詢當前的名稱的屬性的

propertydescriptor。

在上面的**中當

propertyname

是普通屬性的的名字(不包含

.)返回的是當前物件

this。

通過getpropertytype

方法可以獲取到指定屬性名稱的型別。

下面是獲取到具體屬性的值

我來具體的看下是怎麼通過屬性名稱來獲取擁有當前屬性的例項物件

.先判斷屬性名稱中有沒有包含

.當沒有包含的時候直接返回當前物件,當包含

.的時候例項化屬性名稱中包含的類

.

原始碼分析之LayoutInflater

簡介 inflate填充的過程 viewstub,merge,include的載入過程 layoutinflater系統服務的註冊過程 systemserviceregistry類有個靜態 塊,完成了常用服務的註冊,如下 static 註冊am registerservice context.act...

原始碼分析之HashMap

首先hashmap繼承了abstractmap,並且實現了map cloneable和serializable三個介面。cloneable和serializable是比較常規的兩個介面,在這裡並不作為重點。重點將會放在abstractmap和map兩個規範上。其中abstractmap是乙個抽象類,...

原始碼分析之String

先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...