IOC的三级缓存图文详细解析(含如何解决循环依赖问题)
1. 三级缓存(1) 一级缓存模型(2) 二级缓存模型(3) 三级缓存模型2. 循环依赖问题1. 三级缓存三级缓存是为了解决循环依赖存在的一级缓存就是储存最终的完整bean的容器二级缓存是储存实例化但未初始化的半成品bean三级缓存是为了加工二级缓存中的bean,加工成为一个代理类bean(1) 一级缓存模型(2) 二级缓存模型(3) 三级缓存模型2. 循环依赖问题例如下列代码public cla
1. 三级缓存
三级缓存是为了解决循环依赖存在的
一级缓存就是储存最终的完整bean的容器
二级缓存是储存实例化但未初始化的半成品bean
三级缓存是为了加工二级缓存中的bean,加工成为一个代理类bean
(1) 一级缓存模型
(2) 二级缓存模型
(3) 三级缓存模型
2. 解决循环依赖问题
什么是循环依赖问题
例如下列代码
public class A{
private B b;
}
public class B{
private A a;
}
当实例化A的时候需要实例化B,但实例化B又需要实例化A,那么这就造成了一个死循环,这就是循环依赖问题
spring中@Autowired方式的循环依赖
在Spring中,@Autowired注解,会按照以下顺序来进行注入:有参构造函数->set方法
所以如果是写了有参构造,或者使用了lombok的@AllArgsConstructor注解,@Autowired注解就会默认使用构造器注入的方式,从而有可能引发循环依赖的问题;
循环依赖问题的解决
spring已经帮我们解决了非构造器的循环依赖问题,使用的就是内置的三级缓存
如果是构造方法造成的循环依赖问题,那么可以使用@Lazy注解,来解决此问题
但其实二级缓存就已经解决了循环依赖问题
使用二级缓存(半成品池)解决循环依赖
为什么二级缓存解决了循环依赖问题,还需要三级缓存呢?
因为二级缓存不能解决AOP代理的问题,上图B中的属性A是半成品,不是A的代理类
因为通过AOP的加工,所有bean都会加工成对应的代理类bean
那么这时三级缓存就是为了解决AOP的问题存在的
为了解决半成品bean不是代理类bean的问题,三级缓存出现了,也称为工厂池
AOP什么时候去创建代理对象的?
AOP是在初始化bean之后,在其后置处理器里创建的
三级缓存解决了循环依赖问题+bean不是AOP代理类的bean的问题
加上三级缓存后,那么此时创建A和B的流程如下图
最后推荐一下鲁班大叔的ioc三级缓存讲解视频https://www.bilibili.com/video/BV1ET4y1N7Sp,真的讲的很棒,我就是从中理解的
更多推荐
所有评论(0)