2017-08-25 10 views
0

これはかなり単純な質問のようですが、どこでも答えが見つからないようです。春に@EventListenerアノテーションをSpringの複数のイベントで使用する

、私はこのように、@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の注釈が複数のイベントを聞くとするための正しい方法は何をどのようにすることができ起こる実際のイベントに基づいて、同じ方法での分化?

ありがとうございます。

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

しかし、明らかに、このアプローチは、基礎となるイベントへのアクセスを与えるものではありません。

+0

[this](http://www.logicbig.com/how-to/code-snippets/jcode-spring-framework-eventlistener/)のようなものはありますか? –

答えて

3

これは、複数のイベントをリッスンするイベントリスナーを作成するために、名目上は簡単です。アノテーション付きメソッドが単一のイベントタイプをサポートしている場合、それはあなたが

を示唆しているものを行うことが可能であるようには見えないEventListenerのJavadocに基づいて、この方法は、 リッスンするイベントの種類を反映した、単一のパラメータを宣言してもよいですに。 注釈付きメソッドが複数のイベントタイプをサポートする場合、この注釈 は、クラス 属性を使用して1つ以上のサポートされているイベントタイプを参照することがあります。詳細は、classes()javadocを参照してください。

...

classes)属性が単一の値で指定されている場合、注釈付き 方法は、必要に応じて、単一のパラメータを受け入れることができます。ただし、この 属性が複数の値で指定されている場合は、注釈付きメソッドは にパラメータを宣言する必要があります。

したがって、複数のイベントを消費し、それらのイベントの本体に基づいて異なるアクションを実行するメカニズムはありません。これは必要ではないはずですが、イベント固有の@EventListenerメソッドを常に登録し、共通の機能を実行する共有メソッドを呼び出させるようにしてください。

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

1

春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 
} 
関連する問題