2017-08-25 290 views
0

这似乎是一个非常简单的问题,但我似乎无法在任何地方找到答案。在Spring中的多个事件中使用@EventListener注释

在春天,我可以创造一个监听器使用@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注释听取多个事件和正确的方法怎么能基于这种情况发生的实际情况相同的方法分辩?

非常感谢。

+0

类似[this](http://www.logicbig.com/how-to/code-snippets/jcode-spring-framework-eventlistener/)? –

回答

3

它名义上容易地创建一个事件侦听器监听多个事件:

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

但很明显这种方法不会给你访问到底层的事件。基于的Javadoc EventListener它似乎并不能够做你所提出的建议

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

...

如果(在 classes)属性与一个单一的值指定,注释 方法可任选地接受一个单一的参数。但是,如果此 属性指定了多个值,则注释方法必须 不声明任何参数。

因此,似乎没有任何机制可以消耗多个事件并基于这些事件的主体采取不同的操作。我建议,这不应该是必要的,但你可以随时注册事件特定的方法,然后让他们调用共享方法来执行任何常用功能。

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

1

从Spring 4.2,你可以使用子类在方法声明中处理所有事件的扩展这个子类:

@EventListener 
public void handleEvent(ApplicationEvent event) { 
    // listen all descendants of the ApplicationEvent 
} 

您也可以通过使用annotion的属性缩小事件的列表:

@EventListener({ContextRefreshedEvent.class, ApplicationReadyEvent.class}) 
public void handleEvent(Object event) { 
    // listen only ContextRefreshedEvent and ApplicationReadyEvent 
}