2017-02-10 21 views
0

我真的不能找到一个巧妙的方法在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豆,并自己注册MessageReceiver。我宁愿不必在某处保留一个MessageHandler列表 - 我只是简单地喜欢Spring在上下文中找到任何内容(可能注释了@Bean@Component),并让他们将registerMessageHandler()方法作为布线过程的一部分。

最简单的方法是什么?

回答

0

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

ApplicationEventPublisher可以@Autowired和Spring将连接,如果你使用Spring 4.2或更高版本实现ApplicationListener<T>或方法与@EventListener注释任何@Component

这个特性被各种Spring组件使用,比如Spring安全来广播事件,比如用户认证的时候。

您可以了解这个here

编辑 如果你不喜欢使用内置的消息机制,你可以使用相同的自动检测原理只是建立你自己的。

春天的当前版本允许你@AutoWire基于类型Bean的列表,如果你所有的MessageHandler实例是豆然后,它看起来像这样

@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); 
     } 
    } 

} 

如果您使用的是版本春天的那不支持自动装配集合,那么你应该实现ApplicationContextAware来获得对ApplicationContext的引用,所以你可以调用getBeansOfType()来获得所有的MessageHandlers。

+0

我想它可以工作,但它有点破解和滥用事件机制的东西它不是要做的。我想我宁愿在'@ Configuration' bean中维护一个处理程序列表,如果有一些额外的工作,这至少是正确的。 – BarrySW19

+0

如果你的处理程序事先知道,它听起来像,它们应该是singleton bean,这意味着你可以从Spring上下文获得它们。通过使用'ApplicationContextAware'' MessageReceiver',然后使用'getBeansOfType'或'@ Autowiring'' List '查看'MessageReceiver'。如果处理程序是短暂的,那么您可能需要在代码中注册/取消注册它们。 –

+0

啊,我没有看到autowired集合 - 这似乎是我想要的。 – BarrySW19