SpringアプリケーションにclassXがあり、すべてのSpringBeanが初期化されているかどうかを確認したいと考えています。これを行うために、私はContextRefreshedEventをリッスンしようとしています。
これまでのところ、次のコードがありますが、これで十分かどうかはわかりません。
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
public classX implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//do something if all apps have initialised
}
}
ContextRefreshEvent
が発生します
ApplicationContext
が初期化または更新されたとき。
だからあなたは正しい軌道に乗っています。
あなたがする必要があるのは、classX
のBean定義を宣言することです。
@Component
と、それが含まれているパッケージのコンポーネントスキャンのいずれかを使用します
@Component
public class X implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//do something if all apps have initialised
}
}
または<bean>
宣言付き
<bean class="some.pack.X"></bean>
Springは、BeanのタイプがApplicationListener
であることを検出し、それ以上の構成なしで登録します。
それ以降のSpringバージョンは、アノテーションベースのイベントリスナーをサポートします。 ドキュメント 状態
Spring 4.2以降、
@EventListener
アノテーションを使用して、マネージドBeanの任意のパブリックメソッドにイベントリスナーを登録できます。
上記のX
クラス内で、次のようなアノテーション付きメソッドを宣言できます。
@EventListener
public void onEventWithArg(ContextRefreshedEvent event) {
}
あるいは
@EventListener(ContextRefreshedEvent.class)
public void onEventWithout() {
}
コンテキストはこのメソッドを検出し、指定されたイベントタイプのリスナーとして登録します。
ドキュメントでは、SpEL式を使用した条件付き処理、非同期リスナーなど、完全な機能セットについてさらに詳しく説明しています。
参考までに、Javaには、型、変数などの命名規則があります。クラスの場合、規則では、名前は大文字のアルファベット文字で始まります。
以下のように、アノテーション駆動型イベントリスナーを使用できます。
@Component
public class classX {
@EventListener
public void handleContextRefresh(ContextRefreshedEvent event) {
}
}
登録するApplicationListenerは、メソッドのsignatureで定義されています。
ApplicationReadyEventを優先します。 httpサーバーが起動する前にContextRefreshedEventが呼び出されることがわかりました。 ApplicationReadyEventは、アプリケーションがリクエストを受け取る準備ができていることを確認します。
@EventListener(ApplicationReadyEvent.class)
public void startApp() {
LOGGER.info("Application is now ready!");
}