我们应该使用 JmsOperations 而不是 JmsTemplate 吗? (以及类似的 JmsMessagingOperations 与 JmsMessagingTemplate)

Should we be using JmsOperations instead of JmsTemplate? (And similarly JmsMessagingOperations vs JmsMessagingTemplate)

我和我的团队正在深入研究一个组件,我们正在讨论 JmsTemplate 的委托实现。

深入研究代码,我发现在大多数情况下,基于 SOLID 原则,我们应该在我们的组件中期望 JmsOperations 接口,而不是作为实现的 JmsTemplate。

看着 Spring Documentation on JmsTemplate 我明白了:

Instances of the JmsTemplate class are thread-safe, once configured. This is important, because it means that you can configure a single instance of a JmsTemplate and then safely inject this shared reference into multiple collaborators. To be clear, the JmsTemplate is stateful, in that it maintains a reference to a ConnectionFactory, but this state is not conversational state.

'once configured' 对我来说意味着设置 pubSubDomain 和默认目标等属性,一旦设置 就不应更改 但 JmsTemplate 的旧 JavaBean 结构允许更改。 (eg: shared JmsTemplate,一个线程设置pubSubDomain发送消息到一个topic,同时另一个线程使用它发布到一个queue)

我错了吗?在 Spring Framework 特权 JmsTemplate 或 JmsOperations 中作为注入 bean。我的担心是多余的吗? 我想分享一些经验,也许 Spring 团队

的一些话

你是对的,你不能在运行时改变共享模板的属性;您需要两个模板,一个用于 pub/sub,一个用于队列。

在这种情况下,无论是通过接口还是具体注入它 class 都没有区别。

通常最好通过接口引用它,因为这样可以更容易地在测试中注入模拟实现,或者在需要时交换其他实现。