隨堂筆記8-spring循環依賴

spring循環依賴

// A依賴了B
class A{
public B b;
}
// B依賴了A
class B{
public A a;
}

以上就會出現循環依賴,解決方法,二級三級緩存

  1. bean的生命週期:

    1. spring掃描class文件生成beanDefinition
    2. 根據得到的beanDefinition生成bean
    3. 根據class推斷構造方法
    4. 填充屬性(依賴注入)
    5. 如果某個對象被aop則要生成代理對象
    6. 把最終的代理對象放入單例池中,下次獲取bean時直接從單例池中獲取
  2. 三級緩存

    1. 一級緩存 singletonObjects ;裏面的bean對象經歷了完整的生命週期
    2. 二級緩存 earlySingletonObjects ;是早前的bean對象
    3. 三級緩存 singletonFactories; 是創建早期bean對象的工廠
  3. 如何打破循環依賴

    1. 通過緩存解決,但是存在問題,這個放入緩存中的是原始對象還是代理對象,這個可能導致b依賴a產生衝突

    1676426678717

  4. 三級緩存 singletonFactories

    1. 首先在bean的生命週期內會構造一個objectFactory存入singletonFactories中,這是一個函數接口,爲了創建aop代理對象,如果執行這個則會吧代理對象放入 earlySingletonObjects
    2. 此時對於a而言,當b創建完後,a繼續執行生命週期,按照他本身邏輯進行aop,此時會判斷當前beanName是否在earlyProxyRefenrences中。經過aop判斷後要把a對應的對象放入singletonObjects中,要放入的是代理對象,所以會從earlySingletonObjects中取。至此循環依賴結束
    3. 注意 earlyProxyReferences 這也是一個緩存,記錄原始對象是否進行了aop
  5. 爲什麼一定要三級緩存

    1. 我的理解,爲了遵守bean的生命週期設計
    2. 不知何時吧aop代理對象或者原始對象放入earluSingletonObjects中
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章