2017-02-10 70 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