java - 构造函数注入(inject)的循环依赖

标签 java cyclic-reference

假设我有以下组件:

enter image description here

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

我知道这在 Java 等可变语言中很容易实现。我也知道这可以通过允许接口(interface)的部分可变性来解决,例如描述的 here .

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

  • Producer 有 final Consumerfinal Monitor
  • 消费者有final Monitor
  • Monitor 有final Stopper
  • Stopper 有 final Producerfinal Consumer

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

一般情况下,如何取消循环这种情况和此类情况?换句话说,我最感兴趣的是如何从设计的角度做到不形成循环。有什么提示吗?

最佳答案

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

但请问,为什么必须通过构造函数注入(inject)它们?归根结底,使用 setters 连接 bean 并没有错。

其实在Spring中,通常是先实例化bean,再注入(inject)。所以你可以看看这种方法。

除此之外,您可以采用不同的方式来为您的问题建模(没有循环依赖)。

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

或者,如 Taylor 所建议的,ESB。

可能还有许多其他设计方法,请阅读(例如)Apache Camel Enterprise Integration Patterns一些想法。

关于java - 构造函数注入(inject)的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30926777/

相关文章:

scala - "illegal cyclic reference"涉及隐式的解释

循环依赖 - 结构和函数指针相互引用

java - 如何编译和运行相互依赖的插件 jar

java - Eclipse 中的 list 文件

java - 你好,没有 main 方法的世界(作者 Horstmann)

java - 在某个字符第一次出现时停止

java - 如何列出所有根集合并获取所有产品?

ruby-on-rails - 制造 gem 循环依赖

java.security.NoSuchAlgorithmException :Cannot find any provider supporting AES/ECB/PKCS7PADDING

Maven 说我在多模块项目中有一个循环引用,但不知道为什么