最近想了想循环依赖这个问题,发现循环依赖这个东东还遇到的真不少,下面就来说一下我遇到过的三种循环依赖,读者要是还有其他的循环依赖的情况,可以补充。
第一种:Maven中的循环依赖。
这种情况其实很少见,但是笔者也见到过项目组的其他成员犯过这个错误。他把pom文件修改了,造成了循环依赖的情况,然后上传到svn上了,自己也不验证。
举例来说maven中的循环依赖的情况:假设现在的项目是A,A直接依赖于B,B又直接依赖于C,C又直接依赖于A,看到了吗,首和尾都是A,造成循环依赖了。造成项目build失败。
第二种:Spring中的构造函数注入时的循环依赖。
这种情况也很少见,因为我发现不止我,还有我所在的项目的成员都很少用构造函数注入,但是也要提一下。在这里我以代码来说明这个问题。
public class A{
private B b;
public A(B b){
this.b=b;
}
}
public class B{
private A a;
public B(A a){
this.a=a;
}
}
这里我就省略Spring的配置文件了,看上面的2个类A,B.如果采用构造函数注入,A需要B的实例,而B又需要A的实例。完了,又成环路了,循环依赖了,如果照这样启动Spring,那你是绝对启动不成功的。解决方案:改成属性注入即可。
第三种:线程死锁的循环依赖
在这里我举一个网上的例子来说明线程循环依赖的问题。假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭。他们都需要获得两个锁:共享刀和共享叉的锁。假如线程 “A”获得了刀,而线程“B”获得了叉。线程“A”就会进入阻塞状态来等待获得叉,而线程“B”则阻塞来等待“A”所拥有的刀。SO......,是不是这2个线程构成环路了,A线程依赖B去释放锁,线程B依赖A去释放锁。循环依赖了,so死锁了!!!
其实现在看来,循环依赖的本质是一样,那就是构成了环路,而且这个环路通过程序是无法自己破解的,必须人为对其施加影响
分享到:
相关推荐
循环依赖问题是 Spring 框架中的一种常见问题,解决这种问题需要对 Bean 之间的依赖关系进行重新设计和优化。在本文中,我们探讨了循环依赖问题的成因、解决方案和实现方法,并提供了一些常见的解决方案和实现方法。
Spring解决循环依赖的策略分为以下几个步骤: 1. **一级缓存(singletonObjects)**:存储完全初始化的bean,即已经完成所有依赖注入的bean。这是为了确保每个bean在整个应用中只被实例化一次,并且可以随时被其他...
Spring提供了几种解决循环依赖的策略,包括早期初始化(Eager Initialization)、构造器注入和单例模式。在默认情况下,Spring使用基于字段的惰性初始化来处理循环依赖,但这并不能解决所有情况,特别是对于非单例...
在 Spring 中,循环依赖分为两种:构造器的循环依赖和属性的循环依赖。构造器的循环依赖是指在构造器中有属性循环依赖,例如两个类 A 和 B,A 的构造器中依赖 B,B 的构造器中依赖 A,这种情况下,JVM 无法实例化这...
在本讲座"程序设计-几种循环的比较.pptx"中,主要探讨了三种基本的循环结构:while循环、do...while循环以及for循环,并对比了它们的特点和适用场景。 1. while循环: while循环的格式是`while (condition) { ...
Spring通过几种策略处理循环依赖,但主要分为以下三种类型: 1. **构造器注入(Constructor Injection)**:在构造器注入中,Spring会尝试按顺序创建Bean,但当检测到循环依赖时,它会抛出异常,因为构造器必须在...
- 使用不同的布局容器,比如StackPanel、DockPanel等,这些面板具有更加明确的排列规则,可以减少潜在的循环依赖风险。 3. **利用DataTrigger或Storyboard**: - 对于某些特定条件下的动态布局需求,可以考虑使用...
循环经济视角下的资源依赖型企业创新路径研究,是对传统依赖型企业的转型与升级提出了一种全新的视角和路径。在循环经济的理论架构下,研究如何促进资源依赖型企业通过创新实现可持续发展,是当前研究的热点和难点。...
6. 依赖注入的范围:明确注入的范围可以避免对象之间的循环依赖,保证系统的稳定性。 在C++中实现依赖注入,主要有几种方法: 1. 组装元(Composition Root):在应用程序的入口点(如main函数)或某个统一的位置,...
在“循环语句的用法之速度比较”这个项目中,作者可能通过编写和测试各种循环结构的易语言源码,分析了它们在处理相同任务时的运行时间,从而得出哪种循环语句在特定场景下更高效。这样的比较有助于开发者在编写程序...
### Python中断多重循环的几种方式详解 在编程中,经常会出现需要从循环中提前退出的情况。对于单一层次的循环,通常使用`break`语句即可实现。然而,在处理多重循环时,仅使用`break`语句往往无法满足需求,因为它...
循环经济是一种经济模式,其核心在于“减量化、再利用、再循环”原则,旨在实现物质和能量的高效循环利用,以降低对自然资源的依赖和环境的破坏。该概念最早由美国经济学家K.波尔丁在20世纪60年代提出,它强调建立...
具体来说,滚动Flash循环存储的实现可能包括以下几个关键步骤: 1. **初始化**:设置存储区的边界,创建或加载FAT表,分配必要的工作缓冲区。 2. **数据写入**:当需要写入新数据时,系统会在可用的块中找到一个...
与传统的前馈神经网络(FNNs)不同,RNNs引入了循环连接,使得网络能够捕捉到输入序列中的长期依赖关系。在FNNs中,信息从输入层单向传递到隐藏层,再传递到输出层,各层之间没有反馈,无法处理序列数据中的上下文...
在VBScript(Visual Basic Script)或Visual Basic中,我们有几种类型的循环结构,包括"当"循环(Do While Loop)和"直到"循环(Do Until Loop),以及计数型循环(For Loop)。以下是对这些循环结构的详细解释: 1...
在本章的学习中,我们将探讨几种主要的循环控制结构,包括计数控制、条件控制以及相关的循环语句,如for、while和do-while。 首先,计数控制的循环依赖于一个计数器变量来决定循环的次数。例如,当你需要执行某个...
在电子政务的范畴内,自循环风力发电机的应用可能体现在以下几个方面: 1. **远程信息传输**:电子政务中的一个重要环节是数据的传输和共享。自循环风力发电机可以为偏远地区的电子设备提供稳定的电力供应,确保...
要实现在Android应用中显示GIF图片,我们可以使用以下几种方法: 1. **利用第三方库**:由于Android原生API对GIF支持有限,通常我们会借助第三方库,如`NineOldAndroids`(用于兼容早期Android版本)和`Glide`、`...
本主题“Java4Android 10_循环语句”将深入讲解Java中的几种循环结构,帮助你更好地理解和应用这些概念。 首先,我们有三种主要的循环类型:`for`循环、`while`循环和`do...while`循环。 1. **for**循环:for循环...
1. **循环条件**:计次循环首的执行依赖于一个明确的循环次数,这是与其他语言中基于条件判断的循环(如while)的主要区别。 2. **循环变量**:虽然易语言没有显式的循环变量,但可以通过内部的计数器隐式跟踪当前的...