spring无法用三级缓存解决循环依赖的问题分析
spring無(wú)法解決構(gòu)造器的循環(huán)依賴,對(duì)上述例子稍微進(jìn)行改動(dòng):
@Component("b") public class B {private A a;public B(A a) {this.a = a;} } @Component("a") public class A {private B b;public A(B b) {this.b = b;}// 該方法使用了aop來(lái)完成pubic void test(){} }這種構(gòu)造器的循環(huán)依賴spring是無(wú)法正常進(jìn)行創(chuàng)建的,因?yàn)樵赼進(jìn)行初始化的時(shí)候,在構(gòu)造器階段就會(huì)去找b對(duì)象,在去構(gòu)造b的原始對(duì)象時(shí),在初始化也就是構(gòu)造器階段的時(shí)候又會(huì)去找a的原始對(duì)象,這時(shí)候spring無(wú)法解決,因?yàn)檫@是兩個(gè)構(gòu)造方法進(jìn)行的循環(huán)依賴,此時(shí)三級(jí)緩存中的map中還沒(méi)有放入原始的對(duì)象信息,就更無(wú)法創(chuàng)建出二級(jí)緩存的不完全的a的代理對(duì)象。
解決辦法:
@lazy注解,懶加載機(jī)制:
懶加載表現(xiàn)在什么地方呢?這時(shí)候如果打斷點(diǎn)在this.b=b處,會(huì)發(fā)現(xiàn)spring是構(gòu)造出了b的代理對(duì)象,在真正用到b對(duì)象時(shí),b的代理對(duì)象才會(huì)去單例池中尋找b對(duì)象,去實(shí)現(xiàn)方法。
總結(jié)
以上是生活随笔為你收集整理的spring无法用三级缓存解决循环依赖的问题分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度讲解spring的循环依赖以及三级缓
- 下一篇: 解释afterPropertiesSet