web-dev-qa-db-ja.com

Spring ApplicationListenerはイベントを受信して​​いません

次のApplicationListenerがあります。

package org.mycompany.listeners;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStartedEvent;

public class MyApplicationListener implements ApplicationListener<ContextStartedEvent> {

  public MyApplicationListener() {
    super();
    System.out.println("Application context listener is created!");
  }

  /**
   * {@inheritDoc}
   */
  public void onApplicationEvent(final ContextStartedEvent event) {
    System.out.println("Context '" + event.getApplicationContext().getDisplayName() + "' is started!");
  }

}

そして、次のBean定義:

<bean name="myApplicationListener" class="org.mycompany.listeners.MyApplicationListener" />

Beanは、コンストラクターからのメッセージが出力されると作成されますが、コンテキスト開始イベントは受信されません。私は何が欠けていますか?

38

ContextStartedEventは、コンテキストでConfigurableApplicationContext.start()を明示的に呼び出すと公開されます。コンテキストが初期化されるときに発行されるイベントが必要な場合は、ContextRefreshedEventを使用します。

以下も参照してください:

61
axtavt

遅延ロードされたBean(あなたによると)がないので、間違った理由でイベントを使用する可能性が高く、おそらく InitializingBean interfaceのようなものを使用する必要があります。

public class MyBean implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        // ...
    }

}

Springマニュアルから:

Beanライフサイクルのコンテナーの管理と対話するために、Spring InitializingBeanおよびDisposableBeanインターフェースを実装できます。コンテナは、前者の場合はafterPropertiesSet()を、後者の場合はdestroy()を呼び出して、Beanが初期化およびBeanの破棄時に特定のアクションを実行できるようにします。また、init-methodおよびdestroyメソッドオブジェクト定義メタデータを使用して、クラスをSpringインターフェースに結合することなく、コンテナと同じ統合を実現できます。

ソース: Spring Framework-Lifecycle callbacks

7
Mike Minicki

これが役立つかどうかはわかりませんが、遅延ロードではなくプリロードによって解決された同様の問題があることを漠然と覚えています。これが 概要 の両方です

0
qwerty