spring如何解決循環依賴問題


最近和小伙伴探討Spring的對象管理問題的時候,討論到了Spring的循環依賴問題,之前在書上有看到過,但是當時沒認真看,忘得一干二凈,現在撿起來再學一遍。

我們知道Spring是有一個容器 的概念,但是容器中注入對象的時候,遇到循環依賴注入的情況,Spring是有自己的解決方案的。

首先Spring的循環依賴包括構造器循環依賴和setter循環依賴兩種,前者是無法解決的,遇到這種情況Spring會拋出BeanCurrentlyInCreationException異常,這個沒啥說的。

下面講下另一個循環依賴問題Setter問題。

  對於setter注入方式的循環依賴,Spring容器是通過提前暴露剛完成構造器注入但未完成其他步驟,如setter注入的Bena方式來解決的,而且只能解決單例作用域的bean的循環依賴問題,通過提前暴露一個單例工廠方法,從而使其他bean能夠引用到該bean。

這里先補充下一點前提知識點:https://blog.csdn.net/f641385712/article/details/85067006 這篇文章是講的beanfactory和factorybean以及objectfactory的區別,講的很詳細,點個贊。

在Spring的抽象類AbstractAutowireCapableBeanFactory中doCreateBean方法中有這么一段代碼:

 這個地方就是解決循環依賴的開始,如果這個單例對象是提前暴露的單例,即這個對象屬於循環依賴的對象,並且需要依賴的對象正在創建中,這是Spring的Bean創建狀態,那么就會將一個實現了ObjectFactory的普通工廠類注入到依賴對象中,這個工廠類提供了對正在創建中的需要依賴對象的一個工廠實現。

 上面是Spring給的注入單例的源碼,針對循環依賴的情況就是調用的第二個方法, 第一個方法就是直接注入對象,第二種前面講到了因為其屬於循環依賴,被依賴對象正在創建狀態,所以將ObjcetFactory工廠類導入,當Spring創建完畢這些循環對象后,調用ObjectFactory的getObject方法進行屬性注入。這樣就解決了循環依賴的問題。


免責聲明!

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



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