web-dev-qa-db-ja.com

java ContextRefreshedEventをリッスンする

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
    }
}
  1. このアプローチは、すべてのBeanがイニシャルされているかどうかを確認するのに正しいですか?
  2. ContextRefreshedEventをリッスンできるようにするには、他に何をする必要がありますか? xmlファイルのどこかにclassXを登録する必要がありますか?
11
kk1957

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には、型、変数などの命名規則があります。クラスの場合、規則では、名前は大文字のアルファベット文字で始まります。

21

春> = 4.2

以下のように、アノテーション駆動型イベントリスナーを使用できます。

@Component
public class classX  {

    @EventListener
    public void handleContextRefresh(ContextRefreshedEvent event) {

    }
}

登録するApplicationListenerは、メソッドのsignatureで定義されています。

14
Radouane ROUFID

ApplicationReadyEventを優先します。 httpサーバーが起動する前にContextRefreshedEventが呼び出されることがわかりました。 ApplicationReadyEventは、アプリケーションがリクエストを受け取る準備ができていることを確認します。

    @EventListener(ApplicationReadyEvent.class)
    public void startApp() {
        LOGGER.info("Application is now ready!");
    }
0
Manish