springboot相互依賴 server相互引用方式
springboot相互依賴 server相互引用
public class RoleService{ @Autowired @Lazy private UserServer userServer; } public class UserService{ @Autowired @Lazy private RoleService roleService; }
spring解決相互依賴的問題
構(gòu)造器循環(huán)依賴
@Service public class A {?????? public A(B b) {? } ?} @Service public class B { ????? public C (C c) {? } }? @Service public class C { ????? public A (A a) {? } }
通過構(gòu)造器注入構(gòu)成的循環(huán)依賴,此依賴是無法解決的,只能拋出BeanCurrentlyInCreationException異常表示循環(huán)依賴
描述:創(chuàng)建A類是,構(gòu)造器需要B類,那將去創(chuàng)建B,在創(chuàng)建B時(shí)又發(fā)現(xiàn)需要A類,則又去創(chuàng)建C類,最終在創(chuàng)建C時(shí)發(fā)現(xiàn)又需要A,從而形成一個(gè)環(huán),沒辦法創(chuàng)建。
原理:Spring容器將每一個(gè)正在創(chuàng)建的bean標(biāo)識(shí)符放在一個(gè)“當(dāng)前創(chuàng)建bean池”中,bean標(biāo)識(shí)符創(chuàng)建過程中將一直保持在這個(gè)池中,因?yàn)槿绻趧?chuàng)建bean過程中發(fā)現(xiàn)自己已經(jīng)在“當(dāng)前創(chuàng)建bean池”中時(shí),將會(huì)拋出BeanCurrentlyInCreationException異常表示循環(huán)依賴;而對(duì)于創(chuàng)建完畢的bean將從“當(dāng)前創(chuàng)建bean池”中清除掉。
setter循環(huán)依賴
@Service public class A1 {?????? @Autowired?????? private B1 b1; }? @Service public class B1 {?????? @Autowired?????? public C1 c1; }? @Service public class C1 {?????? @Autowired? public A1 a1; ?}
通過setter注入方式構(gòu)成的循環(huán)依賴。
原理:對(duì)于setter注入造成的依賴是通過Spring容器提前暴露剛完成構(gòu)造器注入但未完成其他步驟(比如setter注入)的bean來完成的,而且只能解決單例作用域的bean循環(huán)依賴。
field屬性注入循環(huán)依賴(prototype)
@Service @Scope("prototype") public class A1 {?????? @Autowired?????? private B1 b1; }? @Service @Scope("prototype") public class B1 {?????? @Autowired?????? public C1 c1; }? @Service @Scope("prototype") public class C1 {?? ??? ?@Autowired? public A1 a1; }
報(bào)錯(cuò)
小結(jié)一下
Spring只能解決Setter方法注入的單例bean之間的循環(huán)依賴
ClassA依賴ClassB,ClassB又依賴ClassA,形成依賴閉環(huán)。Spring在獲取ClassA的實(shí)例時(shí),不等ClassA完成創(chuàng)建就將其曝光加入正在創(chuàng)建的bean緩存中。在解析ClassA的屬性時(shí),又發(fā)現(xiàn)依賴于ClassB,再次去獲取
ClassB,當(dāng)解析ClassB的屬性時(shí),又發(fā)現(xiàn)需要ClassA的屬性,但此時(shí)的ClassA已經(jīng)被提前曝光加入了正在創(chuàng)建的bean的緩存中,則無需創(chuàng)建新的的ClassA的實(shí)例,直接從緩存中獲取即可。從而解決循環(huán)依賴問題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
spring boot使用WebClient調(diào)用HTTP服務(wù)代碼示例
這篇文章主要介紹了spring boot使用WebClient調(diào)用HTTP服務(wù)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Spring常用注解及http數(shù)據(jù)轉(zhuǎn)換教程
這篇文章主要為大家介紹了Spring常用注解及http數(shù)據(jù)轉(zhuǎn)換原理以及接收復(fù)雜嵌套對(duì)象參數(shù)與Http數(shù)據(jù)轉(zhuǎn)換的原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03SpringBoot 中實(shí)現(xiàn)跨域的5種方式小結(jié)
這篇文章主要介紹了SpringBoot 中實(shí)現(xiàn)跨域的5種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02java實(shí)現(xiàn)在普通類中注入service或mapper
這篇文章主要介紹了java實(shí)現(xiàn)在普通類中注入service或mapper的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07詳解mybatis.generator配上最新的mysql 8.0.11的一些坑
這篇文章主要介紹了詳解mybatis.generator配上最新的mysql 8.0.11的一些坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10