gpt4 book ai didi

java - ApplicationContext 事件从未被抛出

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:31 28 4
gpt4 key购买 nike

我正在尝试在所有 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() 所示?)

最佳答案

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

解释:

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

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

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

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

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

关于java - ApplicationContext 事件从未被抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43863977/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com