繁体   English   中英

如何使用Spring连接多个侦听器样式Bean

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM