[英]How To Wire Multiple Listener Style Beans With Spring
在Spring中,我真的找不到一种整齐的方法-想象一下我有一个侦听消息的类:
@Component
public class MessageReceiver {
private List<MessageHandler> handlers = new ArrayList<>();
public void receiveMessage(Message m) {
for(MessageHandler handler: handlers) {
handler.process(m);
}
}
public void registerMessageHandler(MessageHandler handler) {
handlers.add(handler);
}
}
基本上,我希望能够定义多个MessageHandler
bean并自动向MessageReceiver
注册。 我宁愿不必在某个地方维护MessageHandler
的列表-我只是想让Spring在上下文中找到任何内容(可能@Bean
或@Component
注释),并让它们在方法中调用registerMessageHandler()
方法。接线过程。
最干净的方法是什么?
您是否考虑过使用Spring已经包含的事件发布机制?
ApplicationEventPublisher
可以是@Autowired
,如果使用Spring 4.2或更高版本,Spring将连接实现ApplicationListener<T>
任何@Component
或使用@EventListener
注释的方法。
各种Spring组件(例如Spring安全性)都使用此功能来广播事件(例如,当用户进行身份验证时)。
你可以在这里阅读
编辑如果您不喜欢使用内置消息机制,则可以使用相同的自动检测原理来构建自己的消息机制。
当前版本的Spring允许您@AutoWire
基于类型的bean列表,如果您所有的MessageHandler
实例都是bean,则它看起来像这样
@Component
public class MessageReceiver {
private final List<MessageHandler> handlers;
@Autowired
public MessageReceiver(List<MessageHandler> handlers) {
this.handlers = handlers;
}
public void receiveMessage(Message m) {
for (MessageHandler handler : handlers) {
handler.process(m);
}
}
}
如果使用的Spring版本不支持自动装配,则应实现ApplicationContextAware
以获得对ApplicationContext的引用,以便可以调用getBeansOfType()
来获取所有MessageHandlers。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.