spring如何理解循環(huán)依賴?
循環(huán)依賴就是循環(huán)引用,就是兩個或多個Bean相互之間的持有對方,比方CircularityA引用CircularityB,CircularityB引用CircularityC,CircularityC引用CircularityA。形成一個環(huán)狀引用關(guān)系。
在使用Spring時,如果主要采用基于構(gòu)造器的依賴注入方式,則可能會遇到循環(huán)依賴的情況,簡而言之就是Bean A的構(gòu)造器依賴于Bean B,Bean B的構(gòu)造器又依賴于Bean A。
這時候運行測試就會發(fā)現(xiàn)拋出了BeanCurrentlyInCreationException異常。產(chǎn)生這種情況的原因是,Spring在創(chuàng)建Bean時,會首先實例化對象,然后再注入依賴。假設(shè)Spring首先創(chuàng)建Class A,那么就會發(fā)現(xiàn)在構(gòu)造器里有Class B的依賴,所以就會轉(zhuǎn)去創(chuàng)建Class B,又在Class B的構(gòu)造器里發(fā)現(xiàn)了對Class A的依賴,而此時Class A是還未初始化完的,因此又會轉(zhuǎn)去創(chuàng)建Class A。
換成基于setter的依賴注入即可解決這個問題。因為基于setter的依賴注入會首先調(diào)用默認構(gòu)造函數(shù)來實例化對象,然后再調(diào)用setter實現(xiàn)依賴注入。這樣在對象實例化的階段就沒有了任何依賴,因此Class A實例化完成后再調(diào)用Class B,Class B實例化完成后開始設(shè)值,而這時Class A已經(jīng)是實例化完成了的,所以可以成功引用到Class A。