我继承了一个代码库,通过两个渠道提供类似的服务:
两个通道上的消息结构或多或少相似,因此控制器和JMS侦听器中存在大量冗余/重复处理逻辑。解决这个问题的一种方法是将公共逻辑提取到另一个组件中,并将该组件注入@Controller和JMS侦听器。
假设我现在没有时间这样做。有没有办法可以将控制器注入JMS侦听器并调用相同的控制器方法,这些方法在REST请求到达时由Spring的调度程序servlet自动调用。由于控制器没有XML配置,如何将其引用注入JMS侦听器?我不想创建另一个具有不同“id”的控制器bean。
答案 0 :(得分:2)
解决这个问题的一种方法是提取通用逻辑
它不是“单向”,它是唯一的方式。不仅因为将控制器注入JMS消息监听器是您可以对您的架构进行最尴尬的事情之一。但也因为Spring本身不会让你这样做。
在Spring MVC中,实际上有两个上下文:main(声明JMS侦听器)和DispatcherServlet
(MVC)上下文。后者是前者的孩子,这意味着它可以从主要上下文访问bean(否则无法访问控制器中的服务和DAO),但不是相反。
假设我现在没有时间这样做
您当前的架构相当差的事实并不能证明它更糟糕。可能过去一些开发人员没有时间提取通用逻辑,因此重复。现在你想引入从JMS层到web层的非常不寻常的依赖...我宁愿忍受重复。
由于控制器没有XML配置,我如何获得其参考
仅供记录,如果您的控制器名为FooBarController
,请执行以下操作:
@Resource
private FooBarController fooBarController;
可能会有效,但幸运的是,不是从父母到子女的情境。