假设我有以下组件:
- 生产者产生数字并向消费者发送消息
- Producer和Consumer都向Monitor发送消息
- Monitor,随机地说,决定生产/消费过程何时应该停止并向 Stopper 发送消息
- Stopper 然后干净地停止生产者和消费者
我知道这在 Java 等可变语言中很容易实现。我也知道这可以通过允许接口(interface)的部分可变性来解决,例如描述的 here .
但是,即使可能,循环依赖也不是一个好习惯。因此,让我们假设所有引用都是构造函数注入(inject)的和最终的:
- Producer 有
final Consumer
和final Monitor
- 消费者有
final Monitor
- Monitor 有
final Stopper
- Stopper 有
final Producer
和final 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/