弹簧应用程序管理器未接收事件

2022-09-01 00:04:18

我有以下应用程序管理器:

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 name="myApplicationListener" class="org.mycompany.listeners.MyApplicationListener" />

我可以看到bean是在打印来自构造函数的消息时创建的,但是从未收到上下文启动事件。我错过了什么?


答案 1

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

另请参阅:


答案 2

由于您没有延迟加载的bean(根据您的说法),那么您很可能出于错误的原因使用事件,并且可能应该使用类似InfializingBean接口的东西:

public class MyBean implements InitializingBean {

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

}

来自弹簧手册:

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

来源:Spring Framework - 生命周期回调


推荐