面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?

今年的铜三铁四到了,给大家写几篇面试题解析

文章目录

    • 什么是Spring中的循环依赖?
    • Spring怎么解决循环依赖?
    • 流程图
      • 缓存内部情况1
      • 缓存内部情况2
      • 缓存内部情况3
      • 缓存内部情况4
      • 缓存内部情况5
      • 缓存内部情况6
      • 缓存内部情况7
      • 缓存内部情况8

什么是Spring中的循环依赖?

A依赖于B

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第1张图片

B依赖于A

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第2张图片

对应的xml文件

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第3张图片

关系图

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第4张图片

Spring怎么解决循环依赖?

spring使用了三级缓存来解决依赖,把bean的实例化和初始化分开存放

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第5张图片

一级缓存singletonObjects:存放初始化完成后的bean
二级缓存earlySingletonObjects:存放实例化完成后的bean
三级缓存singletonFactories:解决有aop代理的bean的循环依赖问题

流程图

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第6张图片
在线流程图

准备debug环境:

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第7张图片

进入ClassPathXmlApplicationContext的构造方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第8张图片

finishBeanFactoryInitialization方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第9张图片

preInstantiateSingletons方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第10张图片

getBean方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第11张图片

doGetBean方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第12张图片

getSingleton方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第13张图片

去一级缓存里面拿a

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第14张图片

返回的singletonObject为空

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第15张图片

缓存内部情况1

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第16张图片

返回的a为空,一级缓存里面没有a对象

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第17张图片

getSingleton方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第18张图片

调用lambda方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第19张图片

createBean方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第20张图片

doCreateBean方法,实例化a对象

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第21张图片

getWrappedInstance方法,完成a的创建,底层使用反射创建对象

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第22张图片

addSingletonFactory方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第23张图片

向三级缓存加a对象

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第24张图片

缓存内部情况2

此时缓存情况,a对象b属性为null

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第25张图片

populateBean方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第26张图片

applyPropertyValues方法,填充b属性

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第27张图片

resolveValueIfNecessary方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第28张图片

resolveReference方法,处理b属性

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第29张图片

getBean方法,又回到了这个方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第30张图片

getSingleton方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第31张图片

此时没有缓存中没有b对象

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第32张图片

createBean方法,创建b对象

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第33张图片

缓存内部情况3

到目前为止,a和b对象的情况为

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第34张图片

addSingletonFactory方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第35张图片
面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第36张图片

缓存内部情况4

此时缓存里面的情况为

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第37张图片

populateBean方法,给b对象里面的a属性填充值

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第38张图片

applyPropertyValues方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第39张图片

又回到了上面的方法applyPropertyValues,第二次出现,又回到了getSingleton方法,从一级缓存里面找a对象

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第40张图片

一级找不到

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第41张图片

二级找不到

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第42张图片

三级找到了

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第43张图片

拿到了半成品的a

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第44张图片

往二级缓存添加a对象,三级缓存删除a对象

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第45张图片

缓存内部情况5

此时的缓存情况,三级缓存移除a,二级缓存添加a

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第46张图片

从三级级缓存拿取到a半成品

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第47张图片

将a的值赋值给b

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第48张图片
面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第49张图片

缓存内部情况6

此时a和b的情况

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第50张图片
面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第51张图片

addSingleton方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第52张图片

此时的b已经是成品了,所以一级缓存添加b,二三级缓存删除b

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第53张图片

缓存内部情况7

现在的缓存情况

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第54张图片

一级缓存已经有了b对象成品,所以只要给对象a赋值就行了

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第55张图片

addSingleton方法

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第56张图片

一级缓存添加a,二三级缓存删除a

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第57张图片

缓存内部情况8

所以此时的缓存情况
面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第58张图片

我们后面从ioc容器中拿取a对象都是从一级缓存里面直接拿a的成品

面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第59张图片
面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?_第60张图片

你可能感兴趣的:(spring,面试,java)