java循环依赖

news2025/2/25 8:49:16

java循环依赖

什么叫循环依赖?
Java循环依赖是指两个或多个类之间存在相互依赖的情况,造成它们互相持有对方的实例而无法正确地加载和初始化。这种问题通常发生在使用Spring等依赖注入框架时,因为这些框架会自动管理类的实化和注入。
我们看个例子。首先创建两个实体类:A和B。A中有个B对象的属性,B中有个A对象的属性。

@Component
public class A {
	private B b;

	public B getB() {
		return b;
	}

	public void setB(B b) {
		this.b = b;
	}
}
@Component
public class B {
	private A a;

	public A getA() {
		return a;
	}

	public void setA(A a) {
		this.a = a;
	}
}

这是创建对象时的一个流程。当我们创建A对象时,需要把B对象填充到A的b属性,当我们去容器里查找时,没有则会去创建B对象,同样需要把A对象填充到B的a属性,但这时容器里没有A对象,我们就需要去创建A对象,这时就陷入了循环。
在这里插入图片描述

解决方式:使用缓存打破循环。
当A实例完就将A对象放入缓存,这时的A只是创建了,属性全是默认值,可以认为是一个半成品。当B去填充a时,会从缓存里找A,这时就不会形成循环了。
在这里插入图片描述
Sping的三级缓存:
Spring在加载BeanDefinition时,会将其缓存到三个不同的缓存中,分别是BeanDefinitionMap、BeanFactory和singletonObjects。其中:

BeanDefinitionMap缓存保存的是以BeanDefinition名称为键,BeanDefinition对象为值的一个Map。

BeanFactory缓存保存的是以Bean名称为键,对应的ObjectFactory对象为值的一个Map,这里的ObjectFactory是用于创建Bean实例的工厂对象。

singletonObjects缓存保存的是以Bean名称为键,对应的Bean实例为值的一个Map,这里的Bean实例是已经创建好的单例Bean实例。

这三个缓存是按照相应的顺序依次使用的,即先从BeanDefinitionMap中查找,如果没有找到,则从BeanFactory缓存中查找,如果还没有找到,则从singletonObjects缓存中取,如果都没有找到,再创建实例并加入到singletonObjects缓存中。这样,通过使用三级缓存,Spring可以提高Bean的加载效率,同时也避免了重复创建Bean实例的问题。

注:
一般的循环依赖其实二级缓存就可以解决,之所有使用三级缓存,是因为使用AOP时有代理对象的存在,二级缓存就无法解决,后续会更新说明。

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

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

相关文章

深度学习基础入门篇[10]:序列模型-词表示{One-Hot编码、Word Embedding、Word2Vec、词向量的一些有趣应用}

【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化…

机器学习神经网络——Adaboost分离器算法

系列文章目录 机器学习之SVM分类器介绍——核函数、SVM分类器的使用 机器学习的一些常见算法介绍【线性回归,岭回归,套索回归,弹性网络】 机器学习相关概念思维导图 文章目录 系列文章目录 前言 Adaboost算法的简单介绍 Adaboost算法相…

Unity之使用Photon PUN开发多人游戏教程

前言 Photon是一个网络引擎和多人游戏平台,可以处理其服务器上的所有请求,我们可以在 Unity(或其他游戏引擎)中使用它,并快速把游戏接入Photon的网络中,而我们就可以专注于在项目中添加逻辑,专注于游戏玩法和功能了。 PUN(Photon Unity Networking)是一种开箱即用的解…

Linux服务器安装启动卸载宝塔面板

宝塔面板简介 宝塔面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能,支持Windows和Linux系统,服务器可以通过网络轻松管理,提高运维效率。例如:创建和管…

极米H6搭载光学变焦打造无损4K,带来更沉浸观影体验

近年来,科技飞速发展,我国涌现出很多新兴科技企业,如家用智能投影、无人机、扫地机器人等行业发展迅速,国际竞争力逐年增强。其中,家用智能投影行业成长快速,正展现出蓬勃的发展生机。根据IDC自2015到2022年…

rollup打包vue组件并发布到npm

个人认为rollup在打包组件的实现方式比用webpack方便,webpack应该是比较适合打包大型的工程项目,而rollup适合打包一些平时在项目中的组件 rollup中文文档:简介 | rollup.js 中文文档 | rollup.js中文网 (rollupjs.com) 这次打包一个滚动加…

python操作mysql

Python 中使用什么第三方库来操作 MySQL ?如何安 装? 使用第三方库为: pymysql 安装: pip install pymysql如何获取链接对象? • from pymysql import Connection 导包 • Connection( 主机 , 端口 , 账户 , 密码 ) 即…

Java基础面试题突击系列4

👩🏻 作者:一只IT攻城狮 ,关注我不迷路 ❤️《java面试核心知识》突击系列,持续更新… 💐 面试必知必会学习路线:Java技术栈面试系列SpringCloud项目实战学习路线 📝再小的收获x365天…

Docker Compose 和 ChatGpt 私有部署

1. 下载 Docker Compose 的二进制文件: Docker Compose 的Github下载链接地址是: Releases docker/compose GitHub 注:这里没有讲解docker的安装,因为已经写好了,在这里可以去看一下,先安装好docker在其弄…

京东购物车如何提升30%性能 | 京东云技术团队

1、背景 购物车面临的挑战: 1)新业务:随着业务形态的丰富,购物车在不断支持各种新业务,依赖的外部接口也随之增加; 2)下沉:一些前端调用的接口下沉到购物车中台; 3&am…

Linux systemd

这里写目录标题 一:配置文件内容二:配置文件位置三:开机启动配置四:systemctl使用 一:配置文件内容 systemd服务配置文件存放在/usr/lib/systemd目录下,有系统system和用户user之分,需要开机不登录就能运行的程序,放在/usr/lib/systemd/syst…

项目跟踪的好处有哪些?项目经理必须了解

项目跟踪要跟踪什么呢?主要针对计划、任务和项目成员三个方面,是为了了解项目的实际进展情况而进行。 在跟踪过程中我们会发现项目计划的不当之处,促使我们去改进和完善计划;发现项目风险,及时解决问题;了…

软件设计之UML用例图大白话教程

1、为什么要使用UML用例图? 对一个复杂问题或者现象的分析,好的方式方法往往能带来事半功倍的效果。比如在软件开发领域,参与的人员角色各种各样,比如软件开发工程师、产品经理、客户、运营人员、老板、用户、B端客户等等&#x…

chatgpt赋能Python-python_kargs

Python中的*kargs:详解 在Python编程中,经常需要为函数传递参数。除了常规的参数传递,Python还支持通过关键字参数传递参数。这种方法比较灵活,可以快速地修改函数的输入参数。其中,kargs是Python中非常常见的一个参数…

管理git项目:003

首先我们得创建一个git管理仓库 进入桌面路径,待会创建的文件可以在桌面找到 cd ..【创建git管理仓库】:创建一个.git 管理仓库, 这个文件被创建后是一个隐藏文件。这个.git文件的作用是:指定当前文件夹作为git管理仓库 git init …

今天,我问了ChatGPT一个难以启齿的问题,内容实录

文 / 高扬(微信公众号:量子论) 七个月前,我是一个害怕失业的漂泊上海的小青年,每天在合租房里刷着LeetCode。 现在我已经在一家人工智能公司从事着自己喜欢的关于机器深度学习的研发工作。 你想知道我的生活发生了什么…

学习git

文章目录 02-为什么要学习Git软件?03 概念:版本控制04 概念:版本控制软件基础功能05 概念:集中式、分布式版本控制系统、多人协作开发5.1 文件冲突问题5.2集中式版本控制(CVS,SVN)5.3 分布式版本…

Word控件Aspose.Words教程:使用 Aspose.在 Java 中对条码使用 ECI 编码

Aspose.Words是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理,并…

LabVIEWCompactRIO 开发指南30 目标间通信

LabVIEWCompactRIO 开发指南30 目标间通信 可以从两种方法选择在FPGA VI和实时处理机上运行的VI之间传输数据的方法:前面板控制和指示器或DMAFIFO。可以使用前面板控件和指示器来传输最新值或标签以及DMA FIFO,以流式传输数据或发送消息和命令。这两种…

数据存储应用与原理剖析

存储引擎 存储引擎就是存放和读取用户数据的地方,对于持久化的存储引擎而言,数据的归宿是非易失性的存储介质(通俗意义上来说就是磁盘)所以该以什么形式组织和存储数据,这就是存储引擎设计的艺术所在这一块涉及到和操…