构造函数注入的循环依赖

时间:2015-06-18 22:18:30

标签: java cyclic-reference

说我有以下组件:

enter image description here

  • 生产者生成数字并向消费者发送消息
  • 生产者和消费者都向Monitor发送消息
  • 监控,随机说,决定何时停止生产/消费过程并向Stopper发送消息
  • Stopper然后干净地停止生产者和消费者

我知道这很容易用Java这样的可变语言来完成。我知道这也可以通过允许接口部分可变来解决,例如描述here

然而,即使可能,拥有循环依赖也不是一个好习惯。因此,让我们假设所有引用都是构造函数注入和最终引用:

  • 制作人有final Consumerfinal Monitor
  • 消费者有final Monitor
  • 监视器有final Stopper
  • Stopper有final Producerfinal Consumer

我找到了诸如this之类的引用,但它们似乎并不适用。

如何解决这种情况和一般情况下的这种情况?换句话说,我最感兴趣的是如何从设计的角度来完成不形成循环。任何提示?

1 个答案:

答案 0 :(得分:2)

你是对的,如果所有依赖都是最终的并且通过构造函数注入,这将不起作用。

但我可以问,为什么必须通过构造函数注入它们?在一天结束时使用setters连接bean是没有错的。

事实上,在Spring中,bean通常先实例化然后注入。所以你可以看看这种方法。

除此之外,您可以看一种不同的方式来模拟您的问题(没有循环依赖)。

例如,由于您已经使用队列在生产者和消费者之间发送消息,为什么不将队列上的消息发送到监视器?塞子也可以向生产者和消费者发送信息。

或者,正如泰勒建议的那样,ESB。

可能有很多其他方法可以设计它,请阅读(例如)Apache Camel Enterprise Integration Patterns以获取某些想法。