ioc 的循环依赖问题

1. 三级缓存

三级缓存是为了解决循环依赖存在的

一级缓存就是储存最终的完整bean的容器

二级缓存是储存实例化但未初始化的半成品bean

三级缓存是为了加工二级缓存中的bean,加工成为一个代理类bean

在这里插入图片描述

 在这里插入图片描述

 在这里插入图片描述

 

循环依赖问题的解决

spring已经帮我们解决了非构造器的循环依赖问题,使用的就是内置的三级缓存

如果是构造方法造成的循环依赖问题,那么可以使用@Lazy注解,来解决此问题

但其实二级缓存就已经解决了循环依赖问题

使用二级缓存(半成品池)解决循环依赖

在这里插入图片描述

为什么二级缓存解决了循环依赖问题,还需要三级缓存呢?

因为二级缓存不能解决AOP代理的问题,上图B中的属性A是半成品,不是A的代理类

因为通过AOP的加工,所有bean都会加工成对应的代理类bean

那么这时三级缓存就是为了解决AOP的问题存在的

为了解决半成品bean不是代理类bean的问题,三级缓存出现了,也称为工厂池

在这里插入图片描述

AOP什么时候去创建代理对象的?

AOP是在初始化bean之后,在其后置处理器里创建的

三级缓存解决了循环依赖问题+bean不是AOP代理类的bean的问题

加上三级缓存后,那么此时创建A和B的流程如下图
 

在这里插入图片描述

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值