在多maven工程的项目里,如果工程间存在循环依赖,构建就会报错。本文介绍一下循环依赖要怎么处理
1、什么是循环依赖
如果工程A依赖工程B,工程B又依赖工程A,就会形成循环依赖。或者A依赖B,B依赖C,C依赖A,也是循环依赖
总的来说,在画出工程依赖图之后,如果发现工程间的依赖连线形成了一个有向循环图,则说明有循环依赖的现象
如果循环依赖发生在工程之间,则会影响构建,因为maven不知道应该先编译哪个工程。如果循环依赖发生在同一个工程的模块之间,虽然不影响编译,但是也是一种不好的实践,说明模块的设计有问题,应该避免
如果在模块内部,有几个类互相调用的话,我觉得可能是正常的。比如观察者模式里面,Observer和Observable就是互相依赖的
2、怎么解决循环依赖
目前知道有2个办法可以解决
第一个办法是用build-helper-maven-plugin插件来规避。比如A依赖B,B依赖C,C依赖A的情况。这个插件提供了一种规避措施,即临时地将工程A、B、C合并成一个中间工程,编译出临时的模块D。然后A、B、C再分别依赖临时模块D进行编译
这种方法可以解决无法构建的问题,但是只是一个规避措施,工程的依赖关系依然是混乱的
第二个办法是通过重构,从根本上消除循环依赖
3、如何重构
目前也知道2个重构的思路
第一个办法是平移,比如A和B互相依赖,那么可以将B依赖A的那部分代码,移动到工程B中,这样一来,B就不需要继续依赖A,只要A依赖B就可以了,从而消除循环依赖
第二个办法是下移,比如A和B互相依赖,同时它们都依赖C,那么可以将B和A相互依赖的那部分代码,移动到工程C里,这样一来,A和B相互之间都不依赖,只继续依赖C,也可以消除循环依赖
这两种重构方式都是可行的,具体采用哪种方式要根据实际情况来判断。不管采取哪种方式,都需要对代码进行修改,有时候并不是那么容易的
分享到:
相关推荐
本篇文章将深入分析 Spring 如何处理循环依赖的设计思想和实现机制。 首先,循环依赖是指不同的 bean 之间出现了循环引用的情况。例如,CycleA 和 CycleB 之间出现了相互引用的情况。在这种情况下,如果不加以处理...
如上所述,Spring默认允许循环依赖,但如果不想让Spring处理循环依赖,可以通过`setAllowCircularReferences(false)`来关闭这个功能。这样,当检测到循环依赖时,Spring会抛出异常,而不是尝试解决。 ### 总结 ...
"LCC"在这里可能指的是"Loop-Closure Constraint"或者某种特定的处理循环依赖的机制。在这个"lcc循环依赖"的重磅资料中,我们可以期待深入探讨这个主题。 循环依赖通常发生在模块、类或对象之间,当一个依赖于另一...
Spring框架在处理循环依赖问题上展现出了其卓越的性能和灵活性。循环依赖是软件设计中常见的问题,特别是在大型Java企业应用中,它可能导致系统僵死或者运行时异常。Spring通过三级缓存机制和AOP代理巧妙地解决了这...
无论是使用ES5的`require`还是ES6的`import`,都需要理解它们在处理循环依赖时的机制,并在必要时利用Babel和其他工具进行优化。通过"es6-circular-deps-test"这样的测试项目,我们可以加深对这一主题的理解,提升...
1. **原型bean的循环依赖**:当bean的scope设置为原型(`@Scope(BeanDefinition.SCOPE_PROTOTYPE)`)时,Spring无法在初始化阶段确定bean的具体实例,因此无法处理循环依赖。在这种情况下,试图创建原型bean会触发...
在默认情况下,Spring使用基于字段的惰性初始化来处理循环依赖,但这并不能解决所有情况,特别是对于非单例bean。 在仿写Spring的过程中,理解并实现这些机制是非常关键的。你需要模拟Spring容器的行为,管理bean的...
nFactories.remove(beanName); } } } } return singletonObject; }``````````````` ...理解并掌握Spring处理循环依赖的方式对于优化和调试Spring应用至关重要,因为循环依赖可能导致难以预料的行为和性能问题。
此外,还可以使用JSON的自定义处理器来处理循环依赖。JSON.stringify()接受一个可选的replacer参数,这是一个函数或数组,用于在序列化之前处理对象的属性。你可以编写一个函数来检查和处理循环依赖: ```...
Spring源码最难问题:当Spring AOP遇上循环依赖 Spring源码中最难的问题之一是循环依赖问题,当Spring AOP遇上循环依赖时,该如何解决? Spring通过三级缓存机制解决循环依赖的问题。 在Spring中,bean的实例化...
对于非单例(prototype)Bean的循环依赖,Spring默认不会处理,因为这些Bean的生命周期较短,通常不期望有循环依赖。但如果开发者明确指定允许循环依赖,Spring会在每次请求prototype Bean时进行实例化和依赖注入,...
在这个简易版的框架中,重点在于如何使用三级缓存来处理循环依赖。在Spring中,循环依赖是指两个或多个bean之间存在相互引用,如果没有正确处理,会导致应用程序无法启动。Spring采用三级缓存机制来解决这个问题: ...
在Spring框架中,循环依赖是指两个或多个Bean之间形成一种环状引用的关系,导致它们相互依赖,无法独立创建。在实际应用中,这种问题通常...在Spring中,理解并正确处理循环依赖对于构建稳定、健壮的应用程序至关重要。
- **只用singletonObjects和earlySingletonObjects**:由于早期bean引用并不包含AOP代理,因此在这种情况下,如果bean需要代理(如`@Transactional`),则无法正确处理循环依赖,因为代理对象的创建是在属性设置和...
本文将深入探讨Spring如何处理循环依赖以及Bean的作用域。 **循环依赖** 循环依赖是指两个或多个Bean之间形成相互依赖的关系,使得在实例化过程中陷入死循环。例如,Bean A依赖于Bean B,同时Bean B也依赖于Bean A...
通过研究这份资源,开发者可以深入理解Spring框架如何处理循环依赖,从而在实际开发过程中避免这类问题,提高代码质量。对于初学者来说,这是一份非常有价值的参考资料,它能帮助你提升Spring框架的使用技能,增强...
在编程领域,循环依赖是一个常见的问题,特别是在对象导向编程中。循环依赖通常指的是两个或多个模块之间形成相互依赖的关系,即模块A依赖于模块B,同时模块B也依赖于模块A。这种关系可能会导致编译错误、运行时异常...
在处理循环依赖时,Spring采用了一种称为"早期初始化"(Early Initialization)的策略。当一个bean正在创建过程中,如果其他bean需要它的未完成版本,Spring会先提供一个代理对象,这个代理对象可以是`...
它保留了内部参照的完整性,可以处理循环参照,可以处理任意深度的嵌套,并且不会导致数据冲突。 json-complete没有依赖性,并且最小压缩后约为3.7KB。 JSON-complete随ES模块和CommonJS支持一起分发。 目的 json-...
然而,Spring通过其强大的依赖注入机制,能够处理大部分场景下的循环依赖问题,但并非所有情况都能解决。 首先,让我们看看Spring如何处理单例bean(Singleton Beans)的循环依赖。在默认情况下,Spring采用三级...