从未抛出ApplicationContext事件

时间:2017-05-09 07:41:01

标签: java spring

我正在尝试在所有ContextXXXEvent上使用ContextEventListener 我为每个事件类型创建了一个监听器,如下所示(ContextRefreshedEvent是一个示例):

@Component
public class MyApplicationRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {

  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
    logger.info(getClass(), "Event source [{}]", event.getSource());
  }

}

ContextRefreshedEventContextClosedEvent都被捕获,他们的听众完成了预期的工作。

我尝试对ContextStartedEventContextClosedEvent执行相同操作,但这两个事件侦听器都未被捕获。

打印event.getSource(在刷新和关闭的事件中):

Event source [Root WebApplicationContext: startup date [Tue May 09 10:07:51 IDT 2017]; root of context hierarchy]

(开始和停止)和(刷新和关闭)之间有什么区别吗?

是否因为我的申请上下文为WebApplicationContext(如event.getSource()所示?)

1 个答案:

答案 0 :(得分:1)

我已经通过了弹簧代码。我将讨论ContextStartedEvent。对于停止的事件可以给出类似的解释。

<强>解释

ContextStartedEvent仅从AbstractApplicationContext的start()方法发出,无处可寻。由于您无法捕获ContextStartedEvent,如果我们可以知道谁调用或不调用此方法,我们可以找到答案。

在spring中,applicationContext可以通过两种方式启动。一,我们明确地调用这个方法start(),这将触发上下文中bean的初始化以及上下文初始化的其余部分。另一种方式是春天来处理上下文初始化。换句话说,我们不会以这种方式处理上下文开始停止。我们几乎所有人都在不知不觉中使用了第二种初始化方式。例如,您必须使用xml文件来加载使用 ClassPathXmlApplicationContext 的bean定义。这是继承自 AbstractRefreshableApplicationContext

因此,我认为仅当您手动启动和停止(管理)ApplicationContext时才会发出ContextStartedEvent和ContextStoppedEvent。还有另一组ApplicationContext实现,您可以使用它们自己管理ApplicationContext。我还没有亲自尝试过。如果我能成功做到这一点,我会更新答案。

可以对ContextStoppedEvent进行类似的解释。

更新:这与春季文档中提供的事件的定义(以及@coolgirl对此问题的其他答案)一致。