文字描述,三级缓存解决循环依赖
A中包含属性B
B中包含属性A
名词介绍
一级缓存
二级缓存
三级缓存
正在创建集合
A实例:完整A实例
A空:只实例化,没有属性赋值
A名称:只是字符串 A的beanName
文字描述三级缓存如何避免循环依赖,A依赖B B依赖A
- 从一级缓存中获取A实例
- 不包含,正在创建集合也不存在A名称,将A名称put进正在创建集合中
- 利用无参构造函数,创建A空
- 判断A是否在正在创建集合,存在则将A空放到三级缓存中
- A空属性赋值
- 属性赋值时发现需要B,则从容器中获取
- 从一级缓存中获取B实例
- 不包含, 正在创建集合也不存在B名称,将B名称put进正在创建集合中
- 利用无参构造函数,创建B空
- 判断B是否在正在创建集合,存在则将B空放到三级缓存中
- B空属性赋值
- 属性赋值时发现需要A,这时就发生了循环依赖,这里也发现,如果没有循环依赖,二级缓存是用不到的
- 一级缓存中是否包含A实例,不包含
- 正在创建集合包含A名称,从二级缓存中获取A空,不存在
- 从三级缓存中获取A空,可以获取到,将A空存放进二级缓存中,并将A空从三级缓存中删除
- 将A空返回至11步骤
- B赋值结束,此时B实例存放在二级缓存中
- 从二级缓存中获取B实例
- 从正在创建结合中,删除B名称
- 将B实例从二级缓存中删除,并B实例put进一级缓存中
- 此时一级缓存中有B,二级缓存中A空, 并且B中的属性A指向二级缓存中的A空
- 返回步骤5
- A空赋值属性B,由A空变为A实例,此时A实例再二级缓存中,A实例中的属性B指向一级缓存中的B实例
- 从正在创建结合中,删除A名称
- 将A实例从二级缓存中删除,并A实例put进一级缓存中
- 此时一级缓存A实例B实例 属性互相指向
网友评论