java listen to ContextRefreshedEvent

2022-09-03 08:56:07

我在春季应用程序中有一个classX,我希望能够找出是否所有弹簧豆都已初始化。为此,我正在尝试收听 ContextRefreshedEvent。

到目前为止,我有以下代码,但我不确定这是否足够。

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

public classX implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
       //do something if all apps have initialised
    }
}
  1. 这种方法是否正确,以确定是否所有豆子都经过了首字母缩写?
  2. 我还需要做些什么才能收听 ContextRefreshedEvent?我需要在xml文件中的某个地方注册classX吗?

答案 1

发生ContextRefreshEvent

当 初始化或刷新 时。ApplicationContext

所以你走在正确的轨道上。

您需要做的是声明 的 Bean 定义。classX

使用和组件扫描它所在的包@Component

@Component
public class X implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
       //do something if all apps have initialised
    }
}

或声明<bean>

<bean class="some.pack.X"></bean>

Spring将检测到Bean是类型并注册它而无需任何进一步的配置。ApplicationListener

后来的Spring版本支持基于注释的事件侦听器。文档说明

从 Spring 4.2 开始,您可以使用注释在受管 Bean 的任何公共方法上注册事件侦听器。@EventListener

在上面的类中,您可以声明一个带注释的方法,例如X

@EventListener
public void onEventWithArg(ContextRefreshedEvent event) {
}

甚至

@EventListener(ContextRefreshedEvent.class)
public void onEventWithout() {

}

上下文将检测此方法并将其注册为指定事件类型的侦听器。

该文档详细介绍了完整的功能集:使用 SpEL 表达式进行条件处理、异步侦听器等。


仅供参考,Java具有类型,变量等的命名约定。对于类,约定是使其名称以大写字母字符开头。


答案 2

弹簧>= 4.2

您可以使用注释驱动的事件侦听器,如下所示:

@Component
public class classX  {

    @EventListener
    public void handleContextRefresh(ContextRefreshedEvent event) {

    }
}

要注册的应用程序管理器在方法的签名中定义。


推荐