Spring ApplicationListener未接收事件

时间:2011-04-20 09:46:56

标签: java spring listener applicationcontext

我有以下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是在打印构造函数的消息时创建的,但是从不接收上下文启动事件。我错过了什么?

3 个答案:

答案 0 :(得分:61)

当您在上下文中显式调用ContextStartedEvent时,将发布

ConfigurableApplicationContext.start()。如果您需要在初始化上下文时发布的事件,请使用ContextRefreshedEvent

另见:

答案 1 :(得分:7)

由于你没有延迟加载bean(根据你的话),你很可能因为错误的原因而使用事件,而且可能应该使用类似InitializingBean接口的东西:

public class MyBean implements InitializingBean {

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

}

来自Spring手册:

  

要与容器管理bean生命周期进行交互,您就可以了   可以实现Spring InitializingBean和DisposableBean   接口。容器为前者调用afterPropertiesSet()   和destroy()为后者允许bean执行某些操作   初始化和销毁​​bean时的操作。您可以   也可以实现与容器的相同集成而无需耦合   你的类通过使用init-method和Spring接口   销毁方法对象定义元数据。

来源:Spring Framework - Lifecycle callbacks

答案 2 :(得分:0)

不确定这是否有帮助,但我依稀记得有一个类似的问题,这是通过预加载而不是延迟加载来解决的。这是两者的quick overview