我正在尝试在所有ContextXXXEvent上使用ContextEventListener
我为每个事件类型创建了一个监听器,如下所示(ContextRefreshedEvent是一个示例):
@Component
public class MyApplicationRefreshedListener implements ApplicationListener
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()显示?)
说明:
ContextStartedEvent仅从AbstractApplicationContext的start()方法发出,无处可寻.由于您无法捕获ContextStartedEvent,如果我们可以知道谁调用或不调用此方法,我们可以找到答案.
在spring中,applicationContext可以通过两种方式启动.一,我们明确地调用此方法start(),它将触发上下文中bean的初始化以及上下文初始化的其余部分.另一种方式是春天来处理上下文初始化.换句话说,我们不处理上下文启动和停止这种方式.我们几乎所有人都在不知不觉中使用了第二种初始化方式.例如,您必须使用xml文件来加载使用ClassPathXmlApplicationContext的bean定义.这是从AbstractRefreshableApplicationContext继承的.
因此,我认为仅当您手动启动和停止(管理)ApplicationContext时才会发出ContextStartedEvent和ContextStoppedEvent.还有另一组ApplicationContext实现,您可以使用它们自己管理ApplicationContext.我个人没试过.如果我能成功做到这一点,我会更新答案.
可以对ContextStoppedEvent给出类似的解释.
更新:这与spring文档中提供的事件的定义一致(以及@coolgirl对此问题的其他答案)