SpringBean的生命周期以及循環依賴過程


上面就是springBean的大致生命周期。

Bean的創建過程

創建Bean之前會調用Bean工廠的后置處理器,可以獲取到BeanDefinition

Bean的初始化過程

初始化之前會調用前置處理器,可以獲取到BeanName和Bean實例

初始化之后會調用后置處理器,也是可以獲取到BeanName和Bean實例,可以做一些屬性的更改等

Bean的初始化也就是注入屬性,這里會涉及到循環依賴的問題。spring默認是開啟循環依賴的。

例如A依賴B,B依賴A

  1. 當創建A對象的時候,會調用getBeanSington()方法,也就是去單例池中查找有沒有A的Bean,A還沒創建成功,肯定沒有。
  2. 調用下一個getBeanSington()方法,判斷A對象是否正在被創建,也就是去查找set集合中有沒有A對象,這時候也沒有,然后將A加入set集合中
  3. 判斷是否支持循環依賴,是否是單例,是的話將A放入singltonFactors也就是第二個map,其實這兒存的是一個工廠,后面就是通過這個工廠獲取對象的
  4. 開始注入屬性B
  5. 也是先去單例池中查找有沒有B的Bean,也沒有
  6. 判斷B對象是否正在被創建,這時候也沒有被創建,將B加入set集合中
  7. 判斷是否支持循環依賴,是否是單例,是的話放入第二個map中,此時map中已經有A和B
  8. B也開始注入屬性A
  9. 去單例池獲取A的Bean,沒有獲取到
  10. 去set集合中獲取A對象,獲取到了,說明A正在被創建
  11. 去第二個map中獲取到A的工廠,然后獲取到對象,如果A對象做了代理,就會在這兒進行代理
  12. B對象注入屬性A完成,如果B對象也做了代理的話,會再初始化完成之后進行AOP
  13. A對象此時就能從單例池中獲取到B對象
  14. A對象萬層初始化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM