如何用Spring连接多个Listener样式Bean

时间:2017-02-10 13:11:24

标签: java spring dependency-injection

我无法在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()方法。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用Spring中已包含的事件发布机制?

ApplicationEventPublisher可以是@Autowired,如果您使用的是Spring 4.2或更新版本,则Spring将连接任何实现@Component的{​​{1}}或使用ApplicationListener<T>注释的方法。

各种Spring组件使用此功能,例如Spring安全性来广播事件,例如在用户进行身份验证时。

您可以阅读有关此here

的信息

修改 如果您不想使用内置消息机制,您可以使用相同的自动检测原则构建自己的消息机制。

Spring的当前版本允许您@EventListener基于类型的bean列表,如果所有@AutoWire实例都是bean,那么它看起来像这样

MessageHandler

如果您使用的是不支持自动装配集合的Spring版本,那么您应该实现@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); } } } 以获取对ApplicationContext的引用,因此您可以调用ApplicationContextAware来获取所有MessageHandler。