45

私は次の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が作成されることがわかりますが、コンテキスト開始イベントが受信されることはありません。私は何が欠けていますか?

4

3 に答える 3

66

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

参照:

于 2011-04-20T10:10:24.733 に答える
7

(あなたによると)遅延ロードされたBeanがないため、間違った理由でイベントを使用している可能性が高く、代わりにInitializingBeanインターフェースのようなものを使用する必要があります。

public class MyBean implements InitializingBean {

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

}

春のマニュアルから:

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

出典:SpringFramework-ライフサイクルコールバック

于 2012-11-28T14:17:45.803 に答える
0

これが役立つかどうかはわかりませんが、同様の問題が発生したことを漠然と覚えています。これは、遅延読み込みではなく、事前読み込みによって解決されました。両方の概要は次のとおりです

于 2011-04-20T10:03:37.797 に答える