Spring解决循环依赖问题

news2024/11/25 20:43:51

一、什么是循环依赖?


例如,就是A对象依赖了B对象,B对象依赖了A对象。(下面的代码属于属性的循环依赖,也就是初始化阶段的循环依赖,区别与底下构造器的循环依赖)

  // A依赖了B
    class A{
        public B b;
    } 

    // B依赖了A
    class B{
        public A a;
    }


    A a = new A();
    B b = new B();

    a.b = b;
    b.a = a;

问题来了:
A Bean创建 ——> 依赖了 B 属性 ——>  触发 B Bean创建 ——>  B 依赖了 A 属性 ——>  需要 A Bean(但A Bean还在创建过程中)

二、怎么解决?使用三级缓存


一级缓存为:singletonObjects; 终态 Bean
二级缓存为:earlySingletonObjects; 临时Bean
三级缓存为:singletonFactories;


/** Cache of singleton objects: bean name –> bean instance */
private final Map singletonObjects = new ConcurrentHashMap(256);

/** Cache of singleton factories: bean name –> ObjectFactory */
private final Map singletonFactories = new HashMap>(16);

/** Cache of early singleton objects: bean name –> bean instance */
private final Map earlySingletonObjects = new HashMap(16);


singletonObjects」中缓存的是已经经历了完整生命周期的bean对象。(用户查询SpringBeanUtil.getBean,也是查一级缓存,因为查二级缓存,可能npe,因为二级缓存的bean是没加载完的,属性可能还没赋值)

earlySingletonObjects」比 singletonObjects 多了一个 early ,表示缓存的是早期的 bean对象。早期指的是 Bean 的生命周期还没走完就把这个 Bean 放入了 earlySingletonObjects。

singletonFactories」中缓存的是 ObjectFactory,表示对象工厂,用来创建某个对象的。
 

在这里插入图片描述

1、A初始化的时候,需要B,但是B没有,所以创建B,

2、B 创建的时候,需要A,A现在还没完事呢,那么会把A 放到 earlySingletonObjects ,B成功取到 A, B创建成功,B放到 SingletonObjects

3、A 从 SingletonObjects 取到 B,A完成初始化

4、A初始化后,会从 earlySingletonObjects 挪到 SingletonObjects 

————————

上面这个步骤没利用只用到了2级缓存,你会发现 B内部的A属性其实存的是 A的原始对象,不是A的终极对象,也就是有2个A对象,一个位于SingletonObjects ,一个位于 earlySingletonObjects 

————————

三级缓存如何解决这个问题?

1、每个对象在创建的时最开始,都会先把自己丢到 singletonFactories 三级缓存里面去

2、初始化的时候,就是给属性 b 赋值的时候,从三级缓存里面getObject就会给你把 b 对象丢给你,就自始至终都是这个对象

3.1 为什么无法解决构造器的循环依赖问题?

 public class A {
        B b;
        public A(B b) {
            this.b = b;
        }
    }


    public class B {
        A a;

        public B(A a) {
            this.a = a;
        }
    }

首先,对象最开始分为两个阶段:实例化阶段(创建阶段) + 初始化阶段 

初始化阶段,主要是给对象内的属性赋值。

实例化阶段,会调用对象的构造函数。

只有实例化后的对象,才会放到三级缓存中去,构造函数是在实例化时调用的,那就都拿不到,没法解决这个问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/881694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是CNN(卷积神经网络)

什么是卷积神经网络 卷积神经网络(Convolutional Neural Network),在一个个填充着数字的正方形小格子,它们被称为卷积核。 原始图片经过输入层后,会变为灰度或是RGB数值填充的矩阵 将卷积核与图片矩阵对齐,对应格子中的数字相乘后…

Dev-C++

文章目录 介绍使用教程常用快捷键文件部分格式部分行操作跳转部分显示部分运行部分调试部分 调试流程 扩展增加编译选项开启优化显示最多警告信息生成调试信息 编译小 trick开大栈定义宏代码格式化 美化字体主题 介绍 Dev-C 是一套用于开发 C/C 程序的自由的集成开发环境&…

信贷行业如何找精准客户的(贷款大数据获客) ?

现在是互联网时代,大数据是指所有社会发展管理体系和经济发展框架中的许多数据信息来源,通常意味着当前的经济环境或市场需求,根据贷款行业三网运营商数据客户资源可以立即计算未来的经济发展趋势,可以让各领域的公司找到生存和发…

哈中盛会,融通互鉴|哈萨克斯坦-中国商业交流论坛引领新合作

为促进哈萨克斯坦与中国商业贸易的交流合作,8月14日,由深圳市跨境电商供应链服务协会、哈萨克斯坦-中国贸易促进协会和跨播集团联合主办的“哈萨克斯坦-中国商业交流论坛”在深圳大中华希尔顿酒店成功举办。哈萨克斯坦共和国副总理兼贸易和一体化部部长朱…

财务数据分析之现金流量表模板分享

现金流量表是我们常说的财务数据分析三表之一。它可以呈现一个企业的现金流情况,揭示企业经营管理健康状态,但在实际使用中却有总给人一种用不上、用不好的矛盾感。怎么才能把现金流量表做好?不如借鉴下大神的现金流量表模板。 下面介绍的是…

【应用笔记】使用 CW32 实现电池备份(VBAT)功能

前言 电池备份(VBAT)功能的实现方法,一般是使用 MCU 自带的 VBAT 引脚,通过在该引脚连接钮扣电池,当系统电源因故掉电时,保持 MCU 内部备份寄存器内容和 RTC 时间信息不会丢失。 本文档介绍了如何基于 C…

iShot Pro for Mac 2.3.9最新中文版

iShot Pro是一款非常优秀的Mac截图软件,软件非常易于操作,主页面还设置了学习教程,可以轻松玩转软件所有功能,并且功能非常强大,不仅可以实现多种截图方式,还可以进行标注、贴图、取色、录屏、录音、OCR识别…

专为茶叶品牌设计的美观小程序制作教程分享

茶叶是中国传统的饮品,拥有悠久的历史和丰富的文化内涵。而如今,随着互联网的快速发展,许多茶叶品牌也开始转向线上销售,以便更好地满足消费者的需求。为了方便茶叶品牌与消费者之间的互动,设计一个美观的小程序是必不…

前后端分离------后端创建笔记(09)密码加密网络安全

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…

禾赛科技Q2营收交付双新高,国产激光雷达从量变到质变

随着2022年激光雷达元年、2023年城市智能辅助驾驶(NOA)元年相继到来,激光雷达产业迎来爆发期。 今年以来,自动驾驶公司、汽车制造商以及移动出行公司等各路人马积极推动城市级别的智能辅助驾驶全面落地,北京、上海、深…

首个全国生态日:契约锁助力各行业节能减排、绿色低碳发展

在国家落实“双碳”、“2030年前实现碳达峰”等目标的背景下,电子签章、电子合同已经成为各行业组织绿色低碳发展的“新底座”,被广泛应用于“政务服务、就医、大学生就业、招投标、购房、购车、货运、保险销售、银行询证函等”众多高频常见的办事、办公…

对不起,这所211我真的不敢考!你行你上!

一、学校及专业介绍 北京工业大学(BeijingUniversityofTechnology)简称“北工大”,校本部位于北京市,是一所多科相结合的市属重点大学,是国家“双一流”建设高校、国家“211工程”建设高校,是京港大学联盟…

浅谈现代医院手术室IT供配电系统的设计与研究

安科瑞 华楠 [摘要] 随着人们的生活水平的不断提高,医疗条件的不断改善,人们对健康越来越重视同时对医疗条件的要求也越来越高,对医院手术室医疗设施提出了新的要求。以往医院普通手术室状况已不能满足人们的要求&…

CentOS系统环境搭建(七)——Centos7安装MySQL

centos系统环境搭建专栏🔗点击跳转 坦诚地说,本文中百分之九十的内容都来自于该文章🔗Linux:CentOS7安装MySQL8(详),十分佩服大佬文章结构合理,文笔清晰,我曾经在这篇文章…

Keepalived+Drbd+nfs实现高可用共享存储

环境准备: 类型IP主机名操作系统内存磁盘主服务器192.168.134.170node1Centos7.92G系统盘40G,存储盘20G备服务器192.168.134.172node3Centos7.92G系统盘40G,存储盘20G 一、两台主机设置hosts文件,打通通道。 vim /etc/hosts 内…

辨析:热功率 轴功率

热功率 反应堆热工里提供的裂变反应堆的释放热 堆芯裂变 反应堆能通过高压蒸汽对外输出的总功率值。 反应堆热功率 轴功率 反应堆输出的蒸汽热能,通过机电系统,能转换成推进轴系,加载到推进螺旋桨上的最大实用功率值。 轴功率是输出的机械…

Redis、Memcache和MongoDB的区别

>>Memcached Memcached的优点: Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度…

HDFS原理剖析

一、概述 HDFS是Hadoop的分布式文件系统(Hadoop Distributed File System),实现大规模数据可靠的分布式读写。HDFS针对的使用场景是数据读写具有“一次写,多次读”的特征,而数据“写”操作是顺序写,也就是…

途乐证券-新手炒股快速入门教程?

随着互联网和金融商场的不断发展,越来越多的人开端重视股票商场。但是对于股市新手来说,怎么快速入门炒股成为了一个困扰他们的难题。以下从多个角度分析,提供一份新手炒股快速入门教程。 1. 了解根本概念 首要,股市新手需求了解…

家教务处管理系统SSM+Bootstrap学生教师课程java jsp源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 家教务处管理系统SSMBootstrap 系统有1权限&#xff…