一尘不染

在Spring中的多个事件上使用@EventListener批注

spring-mvc

这似乎是一个非常简单的问题,但我似乎在任何地方都找不到答案。

在Spring中,我可以使用@EventListener注释为事件创建侦听器,如下所示:

@Component
public class MyListener {

    @EventListener
    public void handleEvent(ContextRefreshedEvent event) {
        ...
    }
}

但是,如果我需要相同的方法来侦听多个事件并根据发生的事件采取不同的行动该怎么办?

凭直觉,我在想类似的东西:

    @Component
    public class MyListener {

        @EventListener
        public void handleEvents(ContextRefreshedEvent event, ContextStopped event) {
             String event;
             if(event instanceof ContextRefreshedEvent)
                  event = "Refreshed";
             if(event instanceof ContextStoppedEvent)
                  event = "Stopped";
        }
    }

EventListener批注侦听多个事件的正确方法是什么?同一方法如何根据发生的实际事件来区分?

非常感谢。


阅读 2858

收藏
2020-06-01

共1个答案

一尘不染

创建一个监听多个事件的事件监听器在名义上很容易:

@EventListener({EventA.class, EventB.class})
public doSomething() {
   ...
}

但是显然,这种方法不能使您访问基础事件。基于javadoc,EventListener似乎无法执行您建议的操作

如果带注释的方法支持单个事件类型,则该方法可以声明单个参数以反映要侦听的事件类型。如果带注释的方法支持多种事件类型,则此注释可以使用classes属性引用一个或多个受支持的事件类型。有关更多详细信息,请参见classes()javadoc。

如果( classes)属性使用单个值指定,则带注释的方法可以选择接受单个参数。但是,如果此属性指定了多个值,则带注释的方法不得声明任何参数。

因此,似乎没有任何机制可以消耗多个事件并根据这些事件的主体采取不同的操作。我建议不要这样做,您可以始终注册特定于事件的@EventListener方法,然后让它们调用共享方法来执行任何常用功能。

来源:https :
//docs.spring.io/spring/docs/current/javadoc-
api/org/springframework/context/event/EventListener.html

2020-06-01