【问题标题】:Maven cyclic dependency issue for Spring projectSpring项目的Maven循环依赖问题
【发布时间】: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


【解决方案1】:

正如@unigeek 所提到的,在这种情况下,接口是你的朋友。在构建 maven 项目的上下文中,这意味着将接口分离到单独的 API maven 模块中。

很快Corning 将意识到它还将GorrilaGlass 提供给Samsung,而不仅仅是Apple。所以现在它不仅需要在AppleWatch 上调用getCurrentMarketOrders(),还需要在Gear2 上调用。解决方案在这一点上变得更加清晰:引入具有AppleSamsung 都依赖的Marketable 接口的API 模块,允许AppleWatchGear2 实现Marketable。那么Corning 只依赖于这个新的 API 模块,而不直接依赖于AppleSamsung,而后者都提供了自己的接口实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 2019-10-18
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2020-09-09
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多