十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
本篇文章給大家分享的是有關(guān)什么是Spring的循環(huán)依賴,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
1、解釋一下循環(huán)依賴的定義。
循環(huán)依賴其實(shí)是指兩個(gè)及以上bean相互持有對(duì)方,最終形成閉環(huán)的過(guò)程,一般聊循環(huán)依賴都是默認(rèn)的單例bean。直白一點(diǎn)解釋就是A依賴B,B依賴C,C又依賴A。ABC三者形成了一個(gè)閉環(huán),這就是循環(huán)依賴。
2、在Spring中有哪些循環(huán)依賴的場(chǎng)景?
(1)構(gòu)造器的循環(huán)依賴
這一種循環(huán)依賴的場(chǎng)景是沒(méi)辦法解決的。
@Service
public class A {
public A(B b) { }
}
@Service
public class B {
public B(C c) {
}
}
@Service
public class C {
public C(A a) { }
}
(2)setter的依賴注入
這種循環(huán)依賴的場(chǎng)景可以使用提前暴露對(duì)象的方式進(jìn)行解決。
public class ExampleBean {
private AnotherBean beanOne;
private YetAnotherBean beanTwo;
private int i;
public void setBeanOne(AnotherBean beanOne) {
this.beanOne = beanOne;
}
public void setBeanTwo(YetAnotherBean beanTwo) {
this.beanTwo = beanTwo;
}
public void setIntegerProperty(int i) {
this.i = i;
}
}
3、描述一下Spring中Bean的生命周期。
(1)Spring啟動(dòng),查找并加載需要被Spring管理的bean,進(jìn)行Bean的實(shí)例化。
(2)Bean實(shí)例化后對(duì)將Bean的引入和值注入到Bean的屬性中。
(3)如果Bean實(shí)現(xiàn)了BeanNameAware接口的話,Spring將Bean的Id傳遞給setBeanName()方法。
(4)如果Bean實(shí)現(xiàn)了BeanFactoryAware接口的話,Spring將調(diào)用setBeanFactory()方法,將BeanFactory容器實(shí)例傳入。
(5)如果Bean實(shí)現(xiàn)了ApplicationContextAware接口的話,Spring將調(diào)用Bean的setApplicationContext()方法,將bean所在應(yīng)用上下文引用傳入進(jìn)來(lái)。
(6)如果Bean實(shí)現(xiàn)了BeanPostProcessor接口,Spring就將調(diào)用他們的postProcessBeforeInitialization()方法。
(7)如果Bean 實(shí)現(xiàn)了InitializingBean接口,Spring將調(diào)用他們的afterPropertiesSet()方法。類似的,如果bean使用init-method聲明了初始化方法,該方法也會(huì)被調(diào)用
(8)如果Bean 實(shí)現(xiàn)了BeanPostProcessor接口,Spring就將調(diào)用他們的postProcessAfterInitialization()方法。
(9)此時(shí),Bean已經(jīng)準(zhǔn)備就緒,可以被應(yīng)用程序使用了。他們將一直駐留在應(yīng)用上下文中,直到應(yīng)用上下文被銷毀。
(10)如果bean實(shí)現(xiàn)了DisposableBean接口,Spring將調(diào)用它的destory()接口方法,同樣,如果bean使用了destory-method 聲明銷毀方法,該方法也會(huì)被調(diào)用。
4、什么是三級(jí)緩存?
(1)第一級(jí)緩存:?jiǎn)卫彺娉豷ingletonObjects。
(2)第二級(jí)緩存:早期提前暴露的對(duì)象緩存earlySingletonObjects。
(3)第三級(jí)緩存:singletonFactories單例對(duì)象工廠緩存。
5、三級(jí)緩存和二級(jí)緩存的區(qū)別?
二級(jí)緩存只需要存儲(chǔ)beanName和提前暴露的bean的實(shí)例的映射關(guān)系即可;三級(jí)緩存不僅需要提前暴露的bean進(jìn)行返回,還要對(duì)該bean做BeanPostProcessor后置處理;三級(jí)緩存將暴露的bean處理完之后,將暴露的bean轉(zhuǎn)移到二級(jí)緩存,同時(shí)刪除三級(jí)緩存的數(shù)據(jù);三級(jí)緩存才是解決循環(huán)依賴的根本。
6、Spring是如何通過(guò)三級(jí)緩存來(lái)解決問(wèn)題的?
對(duì)于單例對(duì)象來(lái)說(shuō),在Spring的整個(gè)容器的生命周期內(nèi),有且只存在一個(gè)對(duì)象,很容易想到這個(gè)對(duì)象應(yīng)該存在Cache中,Spring大量運(yùn)用了Cache的手段,在循環(huán)依賴問(wèn)題的解決過(guò)程中甚至使用了“三級(jí)緩存”。singletonObjects指單例對(duì)象的cache,singletonFactories指單例對(duì)象工廠的cache,earlySingletonObjects指提前曝光的單例對(duì)象的cache。以上三個(gè)cache構(gòu)成了三級(jí)緩存,Spring就用這三級(jí)緩存巧妙的解決了循環(huán)依賴問(wèn)題。
以上就是什么是Spring的循環(huán)依賴,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。