首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么要抱怨循环依赖?

循环依赖是指在软件开发中,两个或多个模块相互依赖,形成一个循环结构。这种情况可能导致代码难以维护和扩展,因此在软件设计中应该尽量避免出现循环依赖。

循环依赖的原因可能有以下几点:

  1. 模块化不合理:如果一个模块的功能过于分散或者过于复杂,可能会导致模块之间的依赖关系变得复杂,从而产生循环依赖。
  2. 耦合度过高:如果模块之间的耦合度过高,可能会导致模块之间的依赖关系变得复杂,从而产生循环依赖。
  3. 代码设计不佳:如果代码设计不佳,可能会导致模块之间的依赖关系变得复杂,从而产生循环依赖。

如果出现循环依赖,可以考虑以下方法来解决:

  1. 重新审视模块化设计:重新审视模块的划分和功能,将模块化设计改为更合理的方式,以减少模块之间的依赖关系。
  2. 降低耦合度:降低模块之间的耦合度,减少模块之间的依赖关系。
  3. 重构代码:重构代码,使其更加清晰和易于维护,减少模块之间的依赖关系。

总之,循环依赖是一种不良的软件设计,应该尽量避免出现。如果出现了循环依赖,应该及时进行修复,以确保代码的健壮性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么选择VersionCatalog来做依赖管理?

+提供新依赖管理工具VersionCatalog,我就不过多介绍这个了。...Android 依赖管理及通用项目配置插件 【Gradle7.0】依赖统一管理的全新方式,了解一下~ 之前大部分文章只介绍了技术方案,很少会去横向对比几个技术方案之间的优劣。...巨型工程最麻烦的事情其实另外一点就是技术栈的切换,因为改起来的地方可真的就是太多了,首先就是先解决复合构建的情况下全局只有一份注册的逻辑,其二就是把当前工程的ext全部转移到toml中,然后最好和之前的方式接近...验收 每个新功能开发最后都是进行验收的,尤其是技改需求,你到时候把功能搞坏了到时候可是背黑锅的啊。而且这种需求也没有办法要求测试进行特别系统性的测试,所以还是开发自己想办法了。...我们拉取了apk包的依赖,然后用HashSet进行了拉平,去除重复依赖,然后通过diff对比前后差异,在基本符合预期的情况下我们就可以进行快速的合入。

56320

spring循环依赖为什么不是二级缓存_有效循环血量不依赖

文章内容引用自 咕泡科技 咕泡出品,必属精品 文章目录 1什么是循环依赖 2 如何解决循环依赖 3无法解决的循环依赖 构造函数循环依赖 多例的循环依赖 前置知识: 所谓的 三级缓存只是三个可以当作是全局变量的...,也就是说我们的Bean其实很大概率都是生成代理类,让我们先来看无代理的情况: Bean的初始化大概是这样的: 根据以上步骤可以看出bean初始化是一个相当复杂的过程,假如初始化A bean...为什么是一个工厂?或者说这个工厂的作用?...为什么三级缓存不直接叫做二级缓存?...首先要解决循环依赖就是先实例化,然后放入三级缓存暴露出来,那么如果是构造函数这一步循环依赖, 实例化的时候就会产生无限递归创建,所以不能解决 多例的循环依赖 如果是多例的,在容器初始化的时候,不会去创建

70830

循环依赖 之 手写代码模拟spring循环依赖

为什么二级缓存和三级缓存 4. spring有没有解决构造函数的循环依赖 5. spring有没有解决多例下的循环依赖. 一. 什么是循环依赖? 如下图所示: ?...循环依赖 之 手写代码模拟spring循环依赖 A类依赖了B类, 同时B类有依赖了A类. 这就是循环依赖, 形成了一个闭环 ?...这也是循环依赖. , 形成了一个闭环 那么, 如果出现循环依赖, spring是如何解决循环依赖问题的呢? 二. 模拟循环依赖 2.1 复现循环依赖 我们定义三个类: 1....为什么呢? 因为, 如果有循环依赖, 在初始化之后才调用, 那就不是动态代理....如果是普通类动态代理在初始化之后执行, 如果是循环依赖, 那么动态代理是在实例化之后. 上面在实例化之后创建proxy的代码不完整, 为什么不完整呢, 因为没有判断是否是循环依赖.

72630

不是说Spring解决了循环依赖问题么-为什么项目还报了循环依赖的异常

SpringBoot项目启动报循环依赖异常 今天,我启动项目项目报循环依赖异常了,为了说明我这里简化了。...是一个典型的循环依赖场景,但是我们知道Spring对于循环依赖问题是做了处理的。但是这里为什么会报错? 循环依赖关联 为此我们来分析下Spring是如何解决循环依赖问题的。...循环依赖出现场景 我们来看看哪些情况属于循环依赖。 对象M的创建依赖S的创建,并且S的创建又依赖M的创建。 循环依赖定义1 对象M的创建依赖S的创建,S的创建依赖O的创建,O的创建依赖M的创建。...只用二级缓存可以解决循环依赖问题么 这时候你是不是有疑问,为什么需要三级缓存?二级缓存能否解决循环依赖问题呢?...那么回到文章开头的问题,标注了@Async注解的方法的bean,为什么Spring没有解决循环依赖问题。 实际上@Async的代理它默认并不支持你去循环引用,因为它并没有把代理对象的早期引用提供出来。

97610

SpringIOC循环依赖

什么是循环依赖 注意: 这⾥不是函数的循环调⽤,是对象的相互依赖关系。 循环调⽤其实就是⼀个死循环,除⾮有终结 条件。 2....循环依赖处理机制 2.1 演示场景: 2.2 处理机制简图 总结: 1. 什么是循环依赖 循环依赖其实就是循环引⽤,也就是两个或者两个以上的 Bean 互相持有对⽅,最终形成闭环。...⽐如A依赖于B,B依赖于C,C⼜依赖于A image.png 注意: 这⾥不是函数的循环调⽤,是对象的相互依赖关系。 循环调⽤其实就是⼀个死循环,除⾮有终结 条件。...Spring中循环依赖场景有: 构造器的循环依赖(构造器注⼊) Field 属性的循环依赖(set注⼊) 其中,构造器的循环依赖问题⽆法解决,只能拋出 BeanCurrentlyInCreationException...循环依赖处理机制 单例 bean 构造器参数循环依赖(⽆法解决) prototype 原型 bean循环依赖(⽆法解决) 因为prototype 原型 bean ,产生对象之后是不在容器中管理的。

21810

再探循环依赖 → Spring 是如何判定原型循环依赖和构造方法循环依赖的?

哥:因为什么荷尔蒙,因为爱情!   侄子:那我妈花点钱,你咋老说呢?   ...哥:这你就不懂了,挣钱本不易,花钱仔细   侄子:快得了吧,挣钱这么少,我妈都没跑,给你照顾家,钱还不让花   哥:我发现你这孩子怎么不知道好赖呢,我攒钱不是为了给你去媳妇啊   侄子:那你赶紧给我妈花吧...Spring 启动正常,但从 Spring 容器获取 loop 实例的时候,报了同样的错误   问题来了:① Spring 是如何甄别原型循环依赖的,然后进行报错提示的        ② 为什么两种情况的报错时机会不一致...    2、Spring 是如何甄别原型循环依赖的     3、为什么单例构造方法循环依赖和原型循环依赖的报错时机不一致   我们慢慢往下看,跟源码的过程可能比较快,大家看仔细了   还是那句话 ?...  3、为什么单例构造方法循环依赖和原型循环依赖的报错时机不一致     单例构造方法实例的创建是在 Spring 启动过程中完成的,而原型实例是在获取的时候创建的     所以两者的循环依赖的报错时机不一致

89710

spring解决循环依赖为什么要用三级缓存?

这里提示得很明显,出现了循环依赖。 什么是循环依赖循环依赖是实例a依赖于实例b,实例b又依赖于实例a。 ? 或者实例a依赖于实例b,实例b依赖于实例c,实例c又依赖于实例a。 ?...像这种多个实例之间的相互依赖关系构成一个环形,就是循环依赖为什么会形成循环依赖?...由于AService和BService都没有提前实例化,在实例化过程中又相互依赖对方的实例作为参数,这样构成了一个死循环,所以最终都无法再实例化了。 spring如何解决循环依赖?...spring为什么循环依赖? 调用applicationContext.getBean(xx)方法,最终会调到AbstractBeanFactory类的doGetBean方法。...总结: 只有单例的情况下才能解决循环依赖问题,并且allowCircularReferences设置成true。

1.2K33

spring解决循环依赖

spring中存在三种循环依赖: 构造器循环依赖: 这种情况 spring 无法处理,将抛出BeanCurrentlylnCreationException异常 单例 Bean setter 循环依赖,...通过三级缓存来解决, 这也是本篇博客描述的地方 非单例循环依赖(如 propertype), 无法提前暴露 Bean, 无法解决 spring 单例对象的初始化过程 spring 单例对象的实例化、初始化过程是在...initializeBean: 回调Bean的方法(postProcessBeforeInitialization->init->postProcessAfterInitialization) 构造器循环依赖...bean 池”中,在创建过程中将一直保持在这个池中,因此如果在创建bean 过程中发现自己已经在”当前创建bean 池” 里时,将抛出BeanCurrentlylnCreationException异常表示循环依赖...;而对于创建完毕的bean 将从”当前创建bean 池”中清除掉 setter循环依赖的处理 spring 使用三级缓存来解决单例 setter 循环依赖: private final Map singletonObjects

47021

Spring解决循环依赖

什么是循环依赖 1.1. 属性的相互依赖 1.2. 构造器的依赖 2. 如何解决 2.1. 三级缓存 2.2. 流程分析 2.3. 结合上述例子分析 3. 为什么不能解决构造器的循环依赖 4....Spring为什么不能解决多例的循环依赖 什么是循环依赖 循环依赖分为两种,一种是构造器的相互依赖,另外一种是属性的相互依赖。...public A(B b){} } public class B{ private B(A a){} } 如何解决 Spring只能解决属性的循环依赖,构造器的循环依赖是不能解决的。...为什么不能解决构造器的循环依赖 Spring解决循环依赖主要是依赖三级缓存,但是的在调用构造方法之前还未将其放入三级缓存之中,因此后续的依赖调用构造方法的时候并不能从三级缓存中获取到依赖的Bean,因此不能解决...Spring为什么不能解决多例的循环依赖 多实例Bean是每次调用一次getBean都会执行一次构造方法并且未属性赋值,根本没有三级缓存,因此解决循环依赖

84212

spring 循环依赖注入

什么是循环依赖 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如A引用B,B引用C,C引用A,则它们最终反映为一个环。...spring 中循环依赖注入分三种情况 构造器循环依赖 setter方法循环注入 2.1 setter方法注入 单例模式(scope=singleton) 2.2 setter方法注入 非单例模式...构造器循环依赖 表示通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖。...2. setter方法循环注入 setter循环依赖:表示通过setter注入方式构成的循环依赖。...对于setter注入造成的依赖是通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(如setter注入)的Bean来完成的,而且只能解决单例作用域的Bean循环依赖

1.1K60

Spring 的循环依赖

前言 记录Spring的一些基本理论,引申出Spring循环依赖的问题 Spring是什么 是容器(承载各种bean) 是基石、生态(SpringBoot、SpringCloud都是在此基础上的扩展)...什么是循环依赖 在上文创建Bean对象流程中,放大属性赋值中自定义属性赋值流程,假设有这种情况:自定义对象A引用了自定义对象B,自定义对象B又引用了自定义对象A,这种情况称之为循环依赖(跟死锁类似)...有种特殊情况,如果A对象中的b属性,是通过构造函授方式注入 ,那么就是在A实例化阶段就需要B对象了,这种情况就无法解决循环依赖的问题!...,为什么需要用到三级缓存?...回顾Bean的生命周期:设计原则是 Bean实例化、属性赋值、初始化之后再去执行AOP生成代理对象 但是为了解决循环依赖但又尽量不打破这个设计原则的情况下,使用了存储了函数式接口的第三级缓存;如果使用二级缓存的话

89810

Spring Bean解决循环依赖为什么是三级缓存?

前言 「循环依赖:就是N个类循环(嵌套)引用」。通俗的讲就是N个Bean互相引用对方,最终形成闭环。...:自己依赖自己 另需注意:这里指的循环引用不是方法之间的循环调用,「而是对象的相互依赖关系」。...本文说一下Spring是如果巧妙的解决平时我们会遇到的三大循环依赖问题的~ Spring Bean的循环依赖 谈到Spring Bean的循环依赖,有的小伙伴可能比较陌生,毕竟开发过程中好像对循环依赖这个概念...,此种循环依赖方式「是无法解决的」,只能抛出BeanCurrentlyInCreationException异常表示循环依赖。...构造器注入循环依赖 2. prototype field属性注入循环依赖 能解决的情况:1. field属性注入(setter方法注入)循环依赖 Spring解决循环依赖的原理分析 在这之前需要明白java

1.2K40

Spring篇之循环依赖

什么是循环依赖 循环依赖就是多个Bean之间存在相互依赖,形成一个闭环,如下,PostService和UserService之间就存在相互依赖,这个依赖并不是方法 之间的依赖,而是Bean与Bean之间的依赖...这也是为什么使用构造函数无法解决循环依赖问题的原因)和进行属性填充,所以就要在这一步之前对Bean进行一些操作, 三级缓存 /** *一级缓存 */ private final Map> singletonFactories = new HashMap(16); Spring解决循环依赖流程 Spring创建PostService这个Bean,会进入AbstractBeanFactory...上面我们说了构造函数Spring不能解决循环依赖问题,Bean为多例也无法解决循环依赖问题,下面来说一下问什么。...怎么避免循环依赖 1.使用@Autowired的方式进行Bean的注入。 2.使用setter方式进行注入。 3.如果存在循环依赖,那么不用构造注入。

90120

说说微服务循环依赖

一、什么是循环依赖 循环依赖的主要形式是直接调用,大概分2种情况,接口间的和应用间: 打个比方,某个应用A提供一个服务S1(Dubbo一般对应一个接口),这个服务提供一个接口I11和I12,而应用B提供另一个服务...S2,这个服务提供接口I21,I22; 1、接口循环依赖 A.S1.I11——》B.S2.I21——》A.S1.I11 即I11接口调用I21接口,而I21接口的实现又调用I11; 2、应用循环依赖...,梳理不当就可能会有线上故障; 3、系统的扩展性受到限制 这里的扩展性分系统和业务2方面,系统上来说假如大促我升级扩容,如果正常不依赖其它应用,或者只依赖少量应用,只升级自己就可以了,如果依赖了其它应用...业务扩展性也是一样的,如果业务发展比较快,支持更多的场景,那就必须考虑新的业务和这些依赖的应用是否兼容,增加研发成本,也不利于扩展。...三、如何避免循环依赖 按上面的情况,如果应用A依赖B,B依赖A,要做到不循环依赖,有以下办法: 1、改为异步调用 即发送MQ消息,这样发送方就不用关心消费方的存在了。

5.5K60

Spring循环依赖问题修复

Spring循环依赖问题修复 拆分的时候,把错误都处理完后,准备把工程起起来,发现弹簧的循环依赖问题。...但是在原工程中并没有这个问题,所以一开始怀疑是配置文件的配置不一样,百度了一下这个错误 beanFactory.setAllowRawInjectionDespiteWrapping(true); 看网上说这个配置了,对于循环依赖的这个错误就会解决掉...于是只能调试进去看看 2.调查查看分析 2.1 spring引用的bean和注入的bean不一致导致的这个错误 由于在原工程里是可以循环引用的,所以对工程和新工程都在初始化这两个循环引用的位置进行了调试...earlyProxyReferences不存在第一个的代理对象的值,返回自己的代理对象,结果导致不一样 解决方法 干掉一个AnnotationAwareAspectJAutoProxyCreator,这个循环依赖的错误

3.3K30

解决spring循环依赖问题

前言今天在写代码的时候出现突然出现了一个循环依赖的异常。循环依赖,可能这是一个在日常工作中非常常见的异常。这篇博客的主要目的是用来处理这种循环依赖的情况。...循环分两种情况:一种是直接去改变业务,让业务不会出现那种循环依赖的情况。一种就是使用懒加载的方式,让两个对应的Bean,加载方式起到一个先后顺序这样,处理依赖冲突。...目的我们这一小节主要是在讲如何处理这个循环依赖,从代码方面实现一个懒加载的方式。因为日常工作中我们可能只需要用一个lazy注解就可以处理了。嗯但是很多人还是会用到lombok这种注解的方式。...异常逻辑这是一个出现循环异常的一个依赖类。这里面用到了lombok这种方式去实现一个Bean的注入。

16700

ioc循环依赖怎么解决

循环依赖 循环依赖是指在Spring容器中,两个或多个bean互相持有对方,最终形成闭环。Spring容器无法创建这样的循环依赖,因为它会破坏依赖关系链。...Spring 通过构造函数注入时,能够更好地处理循环依赖。...需要注意的是,循环依赖可能是代码结构问题的表现,因此在设计类之间的依赖关系时,也应该考虑是否可以进行重构以减少相互依赖。...通过这种方式,Spring容器可以检测到循环依赖的问题,并在创建bean时避免出现循环依赖。...通过这种方式,Spring可以检测到循环依赖的问题,并在创建bean时避免出现循环依赖。 总之,Spring的三级缓存主要用于解决单例的循环依赖问题。

12010

循环依赖产生及规避

其实这句话前半句当然没有错,出现循环依赖的确是设计上的问题,理论上应当将循环依赖进行分层,抽取公共部分,然后由各个功能类再去依赖公共部分。...基于上面的分析,我们基本上也就知道Spring是怎么进行循环依赖调解的了(仅指弱依赖,强依赖循环依赖只有上帝能自动调解)。...5 为什么依赖注入 网上经常看到很多手撸IOC容器的入门科普文,大部分人只是将IOC容器实现成一个“存储Bean的map”,将DI实现成“通过注解+反射将bean赋给类中的field”。...在刚开始学Spring的时候,我一直想不通: 为什么Spring除了构造函数之外还要在Bean生命周期里有一个额外的初始化方法? 这个初始化方法和构造函数到底有什么区别?...为什么Spring建议将初始化的逻辑写在生命周期里的初始化方法里? 现在,把依赖调解结合起来看,解释就十分清楚了: 为了进行依赖调解,Spring在调用构造函数时是没有将依赖注入进来的。

43630
领券