Hola usuario de nuestro sitio, hemos encontrado la solución a tu pregunta, desplázate y la encontrarás a continuación.
Solución:
Es nominalmente fácil crear un detector de eventos que escuche múltiples eventos:
@EventListener(EventA.class, EventB.class)
public doSomething()
...
Pero, obviamente, este enfoque no le da acceso al evento subyacente. Basado en el javadoc para EventListener
no parece posible hacer lo que sugieres
Si un método anotado admite un solo tipo de evento, el método puede declarar un solo parámetro que refleje el tipo de evento que se escuchará. Si un método anotado admite varios tipos de eventos, esta anotación puede hacer referencia a uno o más tipos de eventos compatibles mediante las clases
attribute. Consulte el javadoc de clases() para obtener más detalles.…
Si el
classes
) attribute se especifica con un solo valor, el método anotado puede aceptar opcionalmente un solo parámetro. Sin embargo, si esto
attribute se especifica con varios valores, el método anotado no debe declarar ningún parámetro.
Por lo tanto, no parece haber ningún mecanismo para consumir múltiples eventos y realizar una acción diferente en función del cuerpo de esos eventos. Sin embargo, sugeriría que esto no debería ser necesario, siempre puede registrar eventos específicos @EventListener
métodos, y luego simplemente pídales que llamen a un método compartido para realizar cualquier funcionalidad común.
Fuente: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/event/EventListener.html
Desde Spring 4.2, puede usar la subclase en la declaración del método para manejar todos los eventos que extienden esta subclase:
@EventListener
public void handleEvent(ApplicationEvent event)
// listen all descendants of the ApplicationEvent
ACTUALIZACIÓN 2020-10-07:
NOTA: La solución a continuación funciona pero contradice la documentación oficial (https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/event/EventListener.html#classes–) y puede dejar de funcionar en las próximas versiones de primavera.
También puede reducir la lista de eventos mediante el uso de anotaciones attribute:
@EventListener(ContextRefreshedEvent.class, ApplicationReadyEvent.class)
public void handleEvent(Object event)
// listen only ContextRefreshedEvent and ApplicationReadyEvent
¿Por qué no haces algo como esto?
Desde SpringFramework 4.2
puedes publicar eventos sin extender ApplicationEvent
.
Como respondió, desea escuchar principalmente eventos personalizados. Puedes hacer algo como esto.
Crea una clase Base llamada BaseEvent
.
public class BaseEvent
private String type;
public BaseEvent()
public String getType()
return type;
public void setType(String type)
this.type = type;
Considere eso como la clase base cada vez que quiera publicar un personalizado Event
.
Ahora vamos a crear dos eventos personalizados llamados Example1Event
y Example2Event
.
Example1Event
Clase
public class Example1Event extends BaseEvent
private String message;
public Example1Event()
public String getMessage()
return message;
public void setMessage(String message)
this.message = message;
Example2Event
Clase
public class Example2Event extends BaseEvent
private String message;
public Example2Event()
public String getMessage()
return message;
public void setMessage(String message)
this.message = message;
Su EventListener
se vería así.
public class EventReceiver
public EventReceiver()
@EventListener
public void receiveEvent(BaseEvent event)
String eventType = event.getType();
if (eventType.equals("example1"))
Example1Event example1Event = (Example1Event) event;
System.out.println(example1Event.getMessage());
else if (eventType.equals("example2"))
Example2Event example2Event = (Example2Event) event;
System.out.println(example2Event.getMessage());
Esto funcionará para lo que quieres hacer.
valoraciones y reseñas
Si estás de acuerdo, tienes la libertad de dejar una reseña acerca de qué le añadirías a este tutorial.