IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring如何解决循环依赖问题 -> 正文阅读

[Java知识库]Spring如何解决循环依赖问题

看到一篇文章讲Spring如何解决循环依赖问题,记录一下:

PS:其实正确答案是开发人员做好设计,别让Bean循环依赖,但是没办法,面试官不想听这个。

我们都知道,单例Bean初始化完成,要经历三步:
在这里插入图片描述
注入就发生在第二步,属性赋值,结合这个过程,Spring 通过三级缓存解决了循环依赖:

1、一级缓存 : Map<String,Object> singletonObjects,单例池,用于保存实例化、属性赋值(注入)、初始化完成的 bean 实例
2、二级缓存 : Map<String,Object> earlySingletonObjects,早期曝光对象,用于保存实例化完成的 bean 实例
3、三级缓存 : Map<String,ObjectFactory<?>> singletonFactories,早期曝光对象工厂,用于保存 bean 创建工厂,以便于后面扩展有机会创建代理对象。

我们来看一下三级缓存解决循环依赖的过程:
当 A、B 两个类发生循环依赖时:
在这里插入图片描述
A实例的初始化过程:

1、创建A实例,实例化的时候把A对象??放?三级缓存,表示A开始实例化了,虽然我这个对象还不完整,但是先曝光出来让大家知道

2、A注?属性时,发现依赖B,此时B还没有被创建出来,所以去实例化B

3、同样,B注?属性时发现依赖A,它就会从缓存里找A对象。依次从?级到三级缓存查询A,从三级缓存通过对象??拿到A,发现A虽然不太完善,但是存在,把A放??级缓存,同时删除三级缓存中的A,此时,B已经实例化并且初始化完成,把B放入?级缓存

4、接着A继续属性赋值,顺利从?级缓存拿到实例化且初始化完成的B对象,A对象创建也完成,删除?级缓存中的A,同时把A放??级缓存

5、最后,?级缓存中保存着实例化、初始化都完成的A、B对象

所以,我们就知道为什么Spring能解决setter注入的循环依赖了,因为实例化和属性赋值是分开的,所以里面有操作的空间。如果都是构造器注入的化,那么都得在实例化这一步完成注入,所以自然是无法支持了。

为什么二级缓存不行,必须三级缓存:

主要是为了?成代理对象。如果是没有代理的情况下,使用二级缓存解决循环依赖也是OK的。但是如果存在代理,三级没有问题,二级就不行了。

因为三级缓存中放的是?成具体对象的匿名内部类,获取Object的时候,它可以?成代理对象,也可以返回普通对象。使?三级缓存主要是为了保证不管什么时候使?的都是?个对象。

假设只有?级缓存的情况,往?级缓存中放的显示?个普通的Bean对象,Bean初始化过程中,通过 BeanPostProcessor 去?成代理对象之后,覆盖掉?级缓存中的普通Bean对象,那么可能就导致取到的Bean对象不一致了。
在这里插入图片描述

参考文献:https://mp.weixin.qq.com/s/Y17S85ntHm_MLTZMJdtjQQ

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 10:43:02  更:2022-04-23 10:46:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:55:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码