IOC的三级缓存图文详细解析(含如何解决循环依赖问题)

Posted 小艾路西里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOC的三级缓存图文详细解析(含如何解决循环依赖问题)相关的知识,希望对你有一定的参考价值。

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,那么这就造成了一个死循环,这就是循环依赖问题

循环依赖问题的解决

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

使用二级缓存(半成品池)解决循环依赖
在这里插入图片描述

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

因为二级缓存不能解决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,真的讲的很棒,我就是从中理解的

以上是关于IOC的三级缓存图文详细解析(含如何解决循环依赖问题)的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# Spring源码三千问为什么要用三级缓存来解决循环依赖问题?二级缓存行不行?一级缓存行不行?

人人都能看懂的Spring源码解析,Spring如何解决循环依赖

0源码基础学习Spring源码系列——Spring如何解决循环依赖

javaSpring 自己模拟 Spring 实现 IOC依赖注入 并且 解决 循环依赖

spring的三级缓存解决循环依赖

spring为啥要使用三级缓存解决循环依赖