【发布时间】:2016-09-15 07:51:35
【问题描述】:
我有一个包含约 50 个组件的 Spring 项目。不幸的是,其中一个类导致了 Maven 中的循环依赖问题。故事是这样的:
我在我的 Spring 项目中添加了一个新组件。我们暂时称它为 Apple。它有一个名为 AppleWatch 的@Bean。其中一个实现是 Apple 依赖于另一个组件:Foxconn,因此 AppleWatch 可以调用一个名为 CheapLabor 的 Bean 中的方法。
与此同时,CheapLabor 依赖于另一个组件:Corning。它需要 GorillaGlass 能够加班。
直到 Corning 意识到它想通过根据 Apple 的市场需求制造类似数量的眼镜来省钱之前,情况都很好。所以它试图在 AppleWatch 中调用一个方法 getCurrentMarketOrders()。为此,我将 bean AppleWatch 自动装配到类 GorillaGlass.java 中。那么……
轰隆隆!循环依赖错误!
那么,对于我应该为 Apple 和/或 Corning 做些什么有什么建议吗?
【问题讨论】:
-
通常的建议是依赖接口而不是实现——我怀疑这会有所帮助。另外,请考虑您的依赖关系的方向。例如,我可以看到依赖于玻璃水晶的手表,但反之则不行。听起来你的 GorillaGlass 课程在某种程度上依赖于 AppleWatch——让我摸不着头脑,但也许我只是误解了这个问题。
-
这是构建时错误还是运行时(包括单元测试)错误?
-
@unigeek 我同意。相应地重新设计项目结构肯定能解决这个问题。但事实证明,如果不让我的老板/同事发疯,我就无法改变结构。有很多方法可以解决循环依赖问题。毕竟我想出了这个:将
Corning依赖于Apple的逻辑移动到Apple的一部分:而不是从Apple获取所需的信息,Coring现在从Foxconn获取这些信息,它调用来自Apple的方法。它打破了循环到Apple->Foxconn->Corning。不是最好的举措,但它奏效了。
标签: java spring maven cyclic-dependency