知識積累 Spring迴圈依賴問題怎麼解決?

2021-10-06 19:00:58 字數 977 閱讀 6653

即:a依賴b,b依賴a,構成乙個閉環。

2.1、構造器依賴注入

spring無法解決

2.2、setter方法依賴注入

spring的單例bean的建立分為三步:

this.populatebean:填充屬性

this.initializebean:初始化

迴圈依賴的問題主要發生在第一步和第二步,spring的單例bean是放入cache裡面的,有且只有乙個物件,為了解決迴圈依賴的問題,使用了**快取。

先看看原始碼:

當我們建立a的時候,首先完成第一步例項化,然後將物件快取進singletonfactories(**),然後開始第二步填充屬性,發現b沒有被建立,然後開始建立b,先例項化,後填充屬性,發現依賴a,然後執行上面的**,一級一級快取去查詢,因為a提前通過objectfactory暴露了,所以拿到了還沒有完全初始化完畢的a,並將沒有完全初始化的a放入earlysingletonobjects(二級),這樣b就完成了建立,並且將自己快取到了singletonobjects(一級),這樣a也建立成功了,最後將自己放入singletonobjects(一級)。

對於「singleton」作用域bean,可以通過setallowcircularreferences(false);來禁用迴圈引用

prototype作用域的bean無法解決,因為對於prototype作用域的bean不進行快取,因此無法提前暴露乙個建立中的bean。

spring 迴圈依賴

構造器依賴無法解決,使用 快取解決field屬性依賴。a的屬性依賴b,b的屬性依賴a 建立a,設定依賴屬性b,發現b沒有建立,建立b,設定依賴屬性a,先從一級快取singletonobjects中去獲取。如果獲取到就直接return 如果獲取不到或者物件正在建立中 issingletoncurren...

spring迴圈依賴

關於spring迴圈依賴網上有太多的例子,本文只是簡單的記錄一下。本文預設讀者熟悉spring核心之一控制反轉和依賴注入 在我們的開發過程中,我們基本上對迴圈依賴是無感且不用去考慮如何解決。如上圖中classa使用屬性注入了classb,classb使用屬性注入了classa。如上圖這就是產生了迴圈...

spring避免迴圈依賴

spring避免迴圈依賴 參見數 spring原始碼深度解析 第98頁 什麼是迴圈依賴,例如a引用b,b引用c,c引用a。1.如果通過構造器注入構成的迴圈依賴,這種情況下是沒有辦法解決的。例如如下配置 2.通過setter注入方式構成的迴圈依賴,只能解決單例作用域的bean迴圈依賴。通過提前暴露乙個...