Java Bean獲取流程

2021-09-11 04:35:43 字數 1926 閱讀 3631

inte***ce typeconverter,class abstractbeanfactory

1.方法dogetbean(final string beanname, @nullable final classrequiredtype,@nullable final object args, boolean typecheckonly)

(1).轉換對應的beanname transformedbeanname(string name)

去除factorybean 的修飾符"&"

取指定alias所表示的最終beanname為最終指向bean

(2).嘗試從快取中載入單例,object getsingleton(beanname) 檢查快取中對應的已經載入的bean 返回object sharedinstance,首先從singletonobjects,沒有再從earlysingletonobjects,最後從singletonfactories

singletonobjects 儲存beanname和建立bean例項之間關係

singletonfactories 儲存beanname 和建立bean 工廠之間關係

earlysingletonobjects 儲存beanname 和建立bean 例項之間的關係,與singletonobjects 的不同之處在於,當乙個單例bean 被放到這裡面後,那麼當bean 還在建立過程中,就可以通過getbean 方法獲取到了,其目的是用來檢測迴圈引用。           

registeredsingletons  儲存當前所有巳註冊的bean 。

(3).bean的例項化 (sharedinstance != null && args == null)為true,執行object getobjectforbeaninstance(object beaninstance, string name, string beanname, @nullable rootbeandefinition mbd)   返回對應的例項,有時候存在諸如beanfactory的情況並不是直接返回例項本身而是返回指定方法返回的例項

(4).原型模式的依賴檢查,boolean issingletoncurrentlyincreation(beanname) 只有在單例情況下才會嘗試解決迴圈依賴,例如:a有b的屬性,b中有a的屬性,那麼當依賴注入的時候,就會產生當a 還未建立完的時候因為對於b 的建立再次返回建立a,造成迴圈依賴。

(5).檢測 parentbeanfactory (parentbeanfactory != null && !containsbeandefinition(beanname)) 如果當前不存在beanname,呼叫方法parentbeanfactory.getbean去父類工廠中尋找,父類工廠通常為空

(6).將儲存xml 配置檔案的gernericbeandefinition 轉換為rootbeandefinition  rootbeandefinition getmergedlocalbeandefinition(string beanname),如指定beanname是子bean的話,同時會合併父類的相關屬性text

(7).尋找依賴在spring的載入順序中,在初始化某乙個bean的時候首先會初始化這個bean 所對應的依賴。獲取string dependson = mbd.getdependson(),初始化registerdependentbean(dep, beanname)

(8).針對不同的scope 進行bean 的建立,根據bean的屬性(singleton.prototype.scope.request進行例項化)預設singleton,spring 會根據不同的配置進行不同的初始化策略。

(9).型別轉換 ,通常對該方法的呼叫引數requiredtype是為空的,如果指定的需求型別不為空需要進行型別轉換,否則直接強制轉換,t convertedbean = gettypeconverter().convertifnecessary(bean, requiredtype)

JavaBean 重寫tostring方法的用途

當實體類中,沒有重寫tostring 方法,用rest 格式調介面,傳資料結果的時候,並不會有影響。情況一 new乙個物件,或者從資料庫裡查詢乙個物件,舉例子 查的是user實體,如果沒有tostring方法,system.out.println 列印的話 結果是 com.example.demo....

通過內省機制設定JavaBean

一 步驟 1 使用propertydescriptor類獲取屬性描述者物件 pd引用student的name屬性 propertydescriptor pd new propertydescriptor name student.class 2 通過getwritemethod 方法 invoke ...

javabean淺複製的問題

淺複製的時候,如果本裡面包含了物件這個就會出現問題,bean裡面的對bean的引用是位址的引用而非真正實體的引用,list list new arraylist list.add new student 小哥 女人 lalalalaalala student student new student ...