spring循环依赖
2021-09-09 15:32:46 0 举报
一文彻底读懂spring循环依赖
作者其他创作
大纲/内容
先实例化A
填充属性
2:populateBean方法进行属性填充操作
实例化
④继续被依赖对象A的初始化,此时A的状态为半成品,而B的状态为完成对象
2:然后把B对象赋值给A对象,先把A对象成品放入一级缓存中,然后删除二级缓存以及三级缓存中数据,A对象的初始化操作完成
有
实例化时使用
③依赖对象B进行填充属性,进行依赖对象B的初始化
判断是否存在a对象
半成品
解决的本质:实例化和初始化分开
3:依赖对象A的实例化,再次进入先查找,再创建流程getBean-->doGetBean-->getSingleton(beanName)-->从一级缓存中查找,没有,则从二级缓存中查找,没有则从三级缓存中获取到被依赖对象A之前创建的lambda表达式,而这个值可以作为B对象初始化的属性填充-->然后将依赖对象的lambda表达式存放在二级缓存中,然后删除三级缓存中的A的lambda表达式,此时依赖对象B初始化完成
三级缓存
只用二级缓存行不行?为什么需要三级缓存?
判断是否存在b对象
初始化B
一级缓存不可以同时存放半成品和完整对象,这样的话,依赖对象有可能会取到半成品对象,因为在获取对象的时候,会先从一级缓存中获取,半成品对象无法使用,因此要把半成品和成品的存放空间分开
如果可以保证所有的bean都不调用getEarlyBeanReference方法,就可以使用二级缓存 使用三级缓存的本质在于解决aop的代理问题
循环依赖
再次实例化A
当一个对象需要被代理的时候,会生成两个对象,一个是代理的对象一个是普通对象
初始化A
实例化B
直接赋值成功
font color=\"#ff0000\
先有对象,再对该对象赋值
一级缓存为什么不能解决循环依赖呢?
可以解决循环依赖问题
循环依赖流程
②填充依赖对象B属性进行被依赖对象的初始化
在堆中分配一块内存,没有设置属性
最终完成A对象的初始化操作
三级缓存是如何解决循环依赖问题的呢
否
二级缓存
此时要给a属性赋值,a属性是一个完全独立的对象,要从spring容器中查找对象
完成b对象的实例化
set方法
调用init-method方法
1:先把B对象成品放入一级缓存中,把二级缓存以及三级缓存中数据移除掉
此时要给b属性赋值,b属性是一个完全独立的对象,要从spring容器中查找对象
在堆中分配一块内存单元
构造方法
使用三级缓存将实例化和初始化分开处理(只实例化没有初始化的对象,只是在堆中分配了内存,可以叫做半成品) 创建对象时,先实例化,再初始化,实例化中,会先查找bean,先从一级缓存中查找,找不到,则会将lambda表达式传入三级缓存,三级缓存是一个函数式接口,会返回一个getobject方法,来创建bean,然后在三级缓存中存放对象的半成品,lambda表达式,而依赖的对象在初始化时则会把三级缓存中的被依赖半成品赋值给依赖对象,完成依赖对象的初始化
初始化
为什么三级缓存可以解决AOP的代理问题?
一级缓存
0 条评论
下一页