1前書き

このチュートリアルでは、Springフレームワークによって提供されるイベントサポートメカニズムについて学びます。フレームワークによって提供されるさまざまな組み込みイベントを調べてから、イベントの消費方法を確認します。

カスタムイベントの作成と公開については、https://www.baeldung.com/spring-eventsを参照してください。

Springには、__ApplicationContextを中心に構築されたイベントメカニズムがあります。これは、異なるBean間で情報を交換するために使用できます。イベントをリスンしてカスタムコードを実行することで、アプリケーションイベントを利用できます。

たとえば、ここでのシナリオは、

ApplicationContext

の完全な起動時にカスタムロジックを実行することです。


2標準コンテキストイベント

実際、Springにはさまざまな組み込みイベントがあり、開発者はアプリケーションのライフサイクルとコンテキストにフックし、カスタム操作を行うことができます。

アプリケーションでこれらのイベントを手動で使用することはめったにありませんが、フレームワークはそれ自体を集中的に使用します。 Springでさまざまな組み込みイベントを探索することから始めましょう。


2.1.

ContextRefreshedEvent




  • ApplicationContext

    の初期化または更新時に、

    Springは

    ContextRefreshedEvent

    を発生させます。通常、コンテキストが閉じられていない限り、リフレッシュは複数回トリガーされる可能性があります。


ConfigurableApplicationContext

インターフェースで

refresh()

メソッドを呼び出すことによって手動でイベントを発生させることもできます。


2.2.

ContextStartedEvent



  • ConfigurableApplicationContextで

    start()

    メソッドを呼び出すことによって、

    このイベントをトリガーし、

    ApplicationContext

    を開始します。実際のところ、このメソッドは通常、明示的な停止後にBeanを再起動するために使用されます。このメソッドを使用して、自動起動用の設定がないコンポーネントを処理することもできます。

  • ここで、

    start()

    の呼び出しは



    _



    refresh





    ()._

    ** ではなく常に明示的であることに注意することが重要です。


2.3.

ContextStoppedEvent



ContexturableApplicationContextの

stop()メソッドを呼び出すことによって、

ContextStoppedEvent

が発行されます


ApplicationContext

が停止されたとき

__start()メソッドを使用して、停止したイベントを再開できます。


2.4.

ContextClosedEvent


このイベントは、

ConfigurableApplicationContext



close()メソッドを使用して、

ApplicationContext__が閉じられたとき** に発行されます。実際には、コンテキストを閉じた後に再開することはできません。

コンテキストはそれを閉じると寿命が尽きますので、

ContextStoppedEvent.

のように再起動することはできません。


3

@ EventListener


次に、公開されたイベントを消費する方法を探りましょう。バージョン4.2以降、Springはアノテーション駆動型のイベントリスナー


EventListenerをサポートしています。

特に、このアノテーションを利用して、** メソッドのシグネチャに基づいて

ApplicationListener

を自動的に登録することができます。

@EventListener
public void handleContextRefreshEvent(ContextStartedEvent ctxStartEvt) {
    System.out.println("Context Start Event received.");
}

重要なことに、


@ EventListener

はコアアノテーションであるため、追加の設定は必要ありません

。実際、既存の

<context:annotation-driven/>

要素はそれを完全にサポートしています。


@ EventListener

でアノテーションが付けられたメソッドは、非void型を返すことができます。返された値がnull以外の場合、イベント発生メカニズムはそれに対して新しいイベントを発行します。


3.1. 複数のイベントを聴く

今、リスナーが複数のイベントを消費するのを必要とする状況が生じるかもしれません。

そのようなシナリオでは、https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/event/EventListener.html#classes[classes]属性を使用できます。

@EventListener(classes = { ContextStartedEvent.class, ContextStoppedEvent.class })
public void handleMultipleEvents() {
    System.out.println("Multi-event listener invoked");
}


4アプリケーションイベントリスナ

以前のバージョンのSpring(<4.2)を使用している場合は、https://www.baeldung.com/spring-events[custom

ApplicationEventListener

]を導入し、イベントをリッスンするためにメソッド

onApplicationEvent

]をオーバーライドする必要があります。


5結論

この記事では、Springのさまざまな組み込みイベントについて説明しました。

また、公開されたイベントを聴くためのさまざまな方法を見ました。

いつものように、この記事で使われているコードスニペットはhttps://github.com/eugenp/tutorials/tree/master/spring-core[over Github]です。