Springアプリケーションコンテキストイベント
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]です。