怎麼解決set注入造成的迴圈依賴

2021-10-22 04:44:22 字數 987 閱讀 9742

怎麼解決set注入造成的迴圈依賴

靠**快取區解決的,a,b兩個類,a中有b,b中有a,都是通過setter方法進行依賴注入的。先去例項化a的例項,根據a的beandefinition定義 拿到a class的無參構造方法後,反射建立出來了a的例項物件,這時候a的例項物件,是乙個尚未進行依賴注入和init-method方法呼叫等等邏輯處理的早期例項,他還不能讓業務層直接拿來去用,可以理解為早產兒,在進行後續加工處理之前,會把這個早產兒包裝到乙個objectfactory物件內,然後存放到spring的第**快取中,key為beanname,value是這個objectfactory物件,這樣的話,外部就可以通過這個**快取,拿到這個objectfactory物件,通過get方法,拿到剛剛建立的這個早期物件,然後spring會繼續處理這個早期物件,進行依賴注入,使用getbean(b)的方式去獲取a依賴的b,因為b尚未例項化,所以進入建立b的流程,建立b的早期物件後去處理b的依賴,發現b依賴a,會呼叫getbean(a),去獲取a,可以從第**快取拿到a,然後完成b依賴a的處理,再呼叫b的int-method方法和執行一些bean後處理器的邏輯,b例項化完畢,存放到一級快取中,再次返回處理到a物件的邏輯中,掉用a的int方法,然後把a放到一級快取中。

**快取的資料,什麼時候公升級到二級快取

getbean()的時候,如果獲取到的例項是放在**快取中,那麼會拿到它的objectfactory物件,呼叫get方法,拿到這個例項,返回這個早期例項之前,會進行一次快取公升級,把**快取的objectfactory乾掉,放到二級快取中

為什麼要有**快取的存在

因為動態**會產生新的calss型別,然後新的calss型別再例項化出來乙個例項,它包裝著原生物件,完成增強的,全新的物件,在堆上來看跟原來的物件也不是乙個物件了,所以才必須有這個**快取的

一級快取為單例池:singletonobjects

二級快取為提前**物件:earlysingletonobjects

**快取為提前**物件工廠:singletonfactories

iOS容易造成循引用的場景

timer就是乙個能在從現在開始的未來的某乙個時刻又或者週期性的執行我們指定的方法的物件 nstimer執行的必要條件 對應執行緒的runloop要開啟,mode要對應 下面看timer的迴圈引用 void setblock testblock block id init return self v...

Spring依賴注入的set方式注入 命名空間注入

1.注入普通字段 pojo層 private string name 測試類 public static void main string args 2.引用型別注入 實體類 private address address 3.陣列型別注入 陣列型別 private string books 陣列元...

mysql死鎖是怎麼造成的

造成mysql死鎖的原因 兩個或兩個以上的程序在執行過程中爭奪資源。mysql中有三種鎖,分別是表級鎖 行級鎖和頁面鎖。其中,表級鎖開銷小 加鎖快,不會出現死鎖情況。mysql是一種關係型資料庫管理系統,使用的 sql 語言是用於訪問資料庫的最常用標準化語言。在mysql的使用過程中,會有死鎖的情況...