1. 什么是循環(huán)依賴?循環(huán)依賴其實就是循環(huán)引用,也就是兩個或者兩個以上的bean互相持有對方,最終形成閉環(huán)。比如A依賴于B,B依賴于C,C又依賴于A。如下圖:2. 怎么檢測是否存在循環(huán)依賴檢測循環(huán)依賴相對比較容易,Bean在創(chuàng)建的時候可以給該Bean打標(biāo),如果遞歸調(diào)用回來發(fā)現(xiàn)正在創(chuàng)建中的話,即說明了循環(huán)依賴了。3. Spring怎么解決循環(huán)依賴Spring的循環(huán)依賴的理論依據(jù)基于Java的引用傳遞,當(dāng)獲得對象的引用時,對象的屬性是可以延后設(shè)置的。(但是構(gòu)造器必須是在獲取引用之前) Spring的單例對象的初始化主要分為三步:4.基于構(gòu)造器的循環(huán)依賴Spring容器會將每一個正在創(chuàng)建的Bean 標(biāo)識符放在一個“當(dāng)前創(chuàng)建Bean池”中,Bean標(biāo)識符在創(chuàng)建過程中將一直保持在這個池中,因此如果在創(chuàng)建Bean過程中發(fā)現(xiàn)自己已經(jīng)在“當(dāng)前創(chuàng)建Bean池”里時將拋出BeanCurrentlyInCreationException異常表示循環(huán)依賴;而對于創(chuàng)建完畢的Bean將從“當(dāng)前創(chuàng)建Bean池”中清除掉。 Spring容器先創(chuàng)建單例A,A依賴B,然后將A放在“當(dāng)前創(chuàng)建Bean池”中,此時創(chuàng)建B,B依賴C ,然后將B放在“當(dāng)前創(chuàng)建Bean池”中,此時創(chuàng)建C,C又依賴A, 但是,此時A已經(jīng)在池中,所以會報錯,,因為在池中的Bean都是未初始化完的,所以會依賴錯誤 ,(初始化完的Bean會從池中移除)5.基于setter屬性的循環(huán)依賴6.結(jié)束語不要使用基于構(gòu)造函數(shù)的依賴注入,可以通過以下方式解決: 1.在字段上使用@Autowired注解,讓Spring決定在合適的時機注入 2.用基于setter方法的依賴注入。 參考文章:https://blog.csdn.net/chejinqiang/article/details/80003868來源:https://www./content-4-659801.html |
|