ApplicationContext 事件从未被抛出

2024-01-01

我正在努力拥有ContextEventListener在所有 ContextXXXEvent 上 我为每个事件类型创建了一个侦听器,如下所示(ContextRefreshedEvent是一个例子):

@Component
public class MyApplicationRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {

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

}

Both ContextRefreshedEvent and ContextClosedEvent被抓住了,他们的听众做了预期的工作。

我尝试做同样的事情ContextStartedEvent and ContextClosedEvent但这两个事件监听器都没有被捕获。

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

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

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

是因为我的应用程序上下文是WebApplicationContext(如event.getSource() shows?)


我已经浏览了 spring 代码。我将讨论 ContextStartedEvent。对于停止事件也可以给出类似的解释。

解释:

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

在spring中,applicationContext可以通过两种方式启动。一、我们显式调用这个方法start()这将触发上下文中 Bean 的初始化以及上下文初始化的其余部分。另一种方法是由 spring 负责上下文初始化。换句话说,我们不处理上下文start and stop这边走。几乎我们所有人都在不知不觉中使用了第二种初始化方式。例如,您必须使用 xml 文件来加载使用以下内容的 bean 定义:类路径XmlApplicationContext。这是继承自抽象可刷新应用程序上下文.

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

对于 ContextStoppedEvent 也可以给出类似的解释。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ApplicationContext 事件从未被抛出 的相关文章

随机推荐