2017-08-25 84 views
0

這似乎是一個非常簡單的問題,但我似乎無法在任何地方找到答案。在Spring中的多個事件中使用@EventListener註釋

在春天,我可以創造一個監聽器使用@EventListener註釋的事件,就像這樣:

@Component 
public class MyListener { 

    @EventListener 
    public void handleEvent(ContextRefreshedEvent event) { 
     ... 
    } 
} 

但是,如果我需要什麼相同的方法來監聽多個事件,並根據不同的行爲發生的事件?

直觀地說,我想類似這樣的東西:

@Component 
    public class MyListener { 

     @EventListener 
     public void handleEvents(ContextRefreshedEvent event, ContextStopped event) { 
      String event; 
      if(event instanceof ContextRefreshedEvent) 
        event = "Refreshed"; 
      if(event instanceof ContextStoppedEvent) 
        event = "Stopped"; 
     } 
    } 

什麼是對的EventListener註釋聽取多個事件和正確的方法怎麼能基於這種情況發生的實際情況相同的方法分辯?

非常感謝。

+0

類似[this](http://www.logicbig.com/how-to/code-snippets/jcode-spring-framework-eventlistener/)? –

回答

3

它名義上容易地創建一個事件偵聽器監聽多個事件:

@EventListener({EventA.class, EventB.class}) 
public doSomething() { 
    ... 
} 

但很明顯這種方法不會給你訪問到底層的事件。基於的Javadoc EventListener它似乎並不能夠做你所提出的建議

如果一個註解的方法支持單個事件類型,該方法可以 聲明反映事件類型聽一個參數至。 如果註釋方法支持多種事件類型,則此註釋 可能會使用屬性屬性引用一個或多個支持的事件類型。有關更多詳細信息,請參閱classes()javadoc。

...

如果(在 classes)屬性與一個單一的值指定,註釋 方法可任選地接受一個單一的參數。但是,如果此 屬性指定了多個值,則註釋方法必須 不聲明任何參數。

因此,似乎沒有任何機制可以消耗多個事件並基於這些事件的主體採取不同的操作。我建議,這不應該是必要的,但你可以隨時註冊事件特定的方法,然後讓他們調用共享方法來執行任何常用功能。

來源:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/event/EventListener.html

1

從Spring 4.2,你可以使用子類在方法聲明中處理所有事件的擴展這個子類:

@EventListener 
public void handleEvent(ApplicationEvent event) { 
    // listen all descendants of the ApplicationEvent 
} 

您也可以通過使用annotion的屬性縮小事件的列表:

@EventListener({ContextRefreshedEvent.class, ApplicationReadyEvent.class}) 
public void handleEvent(Object event) { 
    // listen only ContextRefreshedEvent and ApplicationReadyEvent 
} 
相關問題