我正在尝试在所有ContextXXXEvent上使用ContextEventListener
我为每个事件类型创建了一个监听器,如下所示(ContextRefreshedEvent
是一个示例):
@Component
public class MyApplicationRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
logger.info(getClass(), "Event source [{}]", event.getSource());
}
}
ContextRefreshedEvent
和ContextClosedEvent
都被捕获,他们的听众完成了预期的工作。
我尝试对ContextStartedEvent
和ContextClosedEvent
执行相同操作,但这两个事件侦听器都未被捕获。
打印event.getSource
(在刷新和关闭的事件中):
Event source [Root WebApplicationContext: startup date [Tue May 09 10:07:51 IDT 2017]; root of context hierarchy]
(开始和停止)和(刷新和关闭)之间有什么区别吗?
是否因为我的申请上下文为WebApplicationContext
(如event.getSource()
所示?)
答案 0 :(得分:1)
我已经通过了弹簧代码。我将讨论ContextStartedEvent。对于停止的事件可以给出类似的解释。
<强>解释强>
ContextStartedEvent仅从AbstractApplicationContext的start()
方法发出,无处可寻。由于您无法捕获ContextStartedEvent,如果我们可以知道谁调用或不调用此方法,我们可以找到答案。
在spring中,applicationContext可以通过两种方式启动。一,我们明确地调用这个方法start()
,这将触发上下文中bean的初始化以及上下文初始化的其余部分。另一种方式是春天来处理上下文初始化。换句话说,我们不会以这种方式处理上下文开始和停止。我们几乎所有人都在不知不觉中使用了第二种初始化方式。例如,您必须使用xml文件来加载使用 ClassPathXmlApplicationContext 的bean定义。这是继承自 AbstractRefreshableApplicationContext 。
因此,我认为仅当您手动启动和停止(管理)ApplicationContext时才会发出ContextStartedEvent和ContextStoppedEvent。还有另一组ApplicationContext实现,您可以使用它们自己管理ApplicationContext。我还没有亲自尝试过。如果我能成功做到这一点,我会更新答案。
可以对ContextStoppedEvent进行类似的解释。
更新:这与春季文档中提供的事件的定义(以及@coolgirl对此问题的其他答案)一致。