补11月2号学习
循环依赖
出现原因:
image.png
如果两个bean对象你中有我,我中有你,就会在创建bean的时候无线套娃 创建a---实例化a---属性b赋值---创建b---实例化b---给属性a赋值---创建a---实例化a…………
解决方法:(spring会解决)使用三级缓存
image.png
基本思路:打破循环,本来规则是实例化对象,属性赋值后放入容器,现在实例化之后先放半成品到容器中
image.png
大概步骤:
创建a---从缓存中查找(没有)---实例化a---放入三级缓存(放入的是一个lambda表达式,表达式中包含了a的信息,因为这时候a还没创建完成,容器中不会有a)---给属性b赋值---从容器中中查找(没有b)---
创建b---从缓存中查找(没有)---实例化b---放入三级缓存(放入的是一个lambda表达式,表达式中包含了b的信息,因为这时候b还没创建完成,容器中不会有b)---给属性a赋值---从缓存中查找(没有a)---
创建a---从缓存中查找(三级缓存中有a)---执行lambda---获取半成品a(a:属性b=null)---放入二级缓存,删除三级缓存中的a---给b的属性a赋值成功(b:属性a:b=null)---b放入一级缓存(成品b放入放入容器中),删除三级缓存中的b---
b创建完成,给对象a的b属性赋值(a:属性b=b)---
a创建完成---放入一级缓存,删除二级缓存中的a
此时一级缓存中同时存在了完整的 a b对象且互相引用,创建完成
image.png