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時又發(fā)現(xiàn)需要A類,則又去創(chuàng)建C類,最終在創(chuàng)建C時發(fā)現(xiàn)又需要A,從而形成一個環(huán),沒辦法創(chuàng)建。
原理:Spring容器將每一個正在創(chuàng)建的bean標識符放在一個“當(dāng)前創(chuàng)建bean池”中,bean標識符創(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池”中清除掉。
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)依賴。
原理:對于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; }報錯

小結(jié)一下
Spring只能解決Setter方法注入的單例bean之間的循環(huán)依賴
ClassA依賴ClassB,ClassB又依賴ClassA,形成依賴閉環(huán)。Spring在獲取ClassA的實例時,不等ClassA完成創(chuàng)建就將其曝光加入正在創(chuàng)建的bean緩存中。在解析ClassA的屬性時,又發(fā)現(xiàn)依賴于ClassB,再次去獲取
ClassB,當(dāng)解析ClassB的屬性時,又發(fā)現(xiàn)需要ClassA的屬性,但此時的ClassA已經(jīng)被提前曝光加入了正在創(chuàng)建的bean的緩存中,則無需創(chuàng)建新的的ClassA的實例,直接從緩存中獲取即可。從而解決循環(huán)依賴問題。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Java實現(xiàn)在Excel中添加動態(tài)數(shù)組公式
動態(tài)數(shù)組公式是?Excel?引入的一項重要功能,它允許用戶從單個單元格中的公式返回多個結(jié)果值,并將這些值自動填充到與公式單元格相鄰的單元格中,本文主要介紹了如何使用Java實現(xiàn)在Excel中添加動態(tài)數(shù)組公式,x需要的可以參考下2023-12-12
SpringBoot(JAVA)整合微信公眾號消息推送完整步驟(文本、圖片/視頻推送)
微信公眾號消息推送包括文本推送和圖文/視頻推送兩類,文本推送通過模板消息或自定義消息實現(xiàn),而圖文/視頻推送需先上傳素材至臨時/永久素材庫,再上傳圖文消息,最后進行消息推送,文中將實現(xiàn)的方法介紹的非常詳細,需要的朋友可以參考下2024-09-09
Java局部內(nèi)部類和匿名內(nèi)部類定義與用法實例分析
這篇文章主要介紹了Java局部內(nèi)部類和匿名內(nèi)部類,結(jié)合實例形式分析了java局部內(nèi)部類和匿名內(nèi)部類相關(guān)定義、原理與用法,需要的朋友可以參考下2019-08-08

