事件监听

文章目录

spring事件和事件监听器

在spring框架中有许多事件监听的应用。定义事件监听一般有三种角色:事件(event),事件监听器(listener),
事件的发布者(multicaster)。

事件:在java.util包下面有一个类 EventObject,该类只定义了一个Object:source 属性(事件源)。spring事件定义是在该类上面扩展的,ApplicationEvent -> EventObject

监听器:在java.util包下面定义了监听器的顶层接口 EventListener,该接口没有定义任何方法。spring事件监听器接口继承了该接口,ApplicationListener -> EventListener

事件发布器:在spring中有一个类 SimpleApplicationEventMulticaster,该类可以实现spring事件的发布。

spring事件发布的简单示例:

public class Test {

public static void main(String[] args) {
// 1. 定义一个事件发布器
SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster();
// 2.添加WorkEventListener和FreeEventListener事件监听器
multicaster.addApplicationListener(new WorkEventListener());
multicaster.addApplicationListener(new FreeEventListener());
// 3.发布WorkEvent和FreeEvent事件
multicaster.multicastEvent(new WorkEvent(new Object()));
multicaster.multicastEvent(new FreeEvent(new Object()));
}

// WorkEvent 事件->继承自spring的ApplicationEvent。
public static class WorkEvent extends ApplicationEvent{
public WorkEvent(Object source){
super(source);
}
}

// FreeEvent 事件->继承自spring的ApplicationEvent。
public static class FreeEvent extends ApplicationEvent{
public FreeEvent(Object source){
super(source);
}
}

// WorkEvent事件监听器->继承自spring的ApplicationListener,通过泛型可以限制该listener只可接受WorkEvent类型的事件。
public static class WorkEventListener implements ApplicationListener<WorkEvent>{
@Override
public void onApplicationEvent(WorkEvent workEvent) {
System.out.println("WorkEventListener received event->" + workEvent.getClass().getSimpleName());
}
}
// FreeEvent事件监听器->继承自spring的ApplicationListener,通过泛型可以限制该listener只可接受FreeEvent类型的事件。
public static class FreeEventListener implements ApplicationListener<FreeEvent>{
@Override
public void onApplicationEvent(FreeEvent freeEvent) {
System.out.println("FreeEventListener received event->" + freeEvent.getClass().getSimpleName());
}
}
}
// 输出结果:
// WorkEventListener received event->WorkEvent
// FreeEventListener received event->FreeEvent

由于ApplicationListener接口定义每个实现类只能接收一种事件,但对于一个监听器处理多个事件无能为力。故 spring 又在 ApplicationListener接口上扩展了一个接口SmartApplicationListener,该接口可以通过判断事件和事件源来决定是否处理该事件,更加的灵活。

public class Test {

public static void main(String[] args) {
SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster();
multicaster.addApplicationListener(new MySmartListener());
multicaster.multicastEvent(new WorkEvent(new Object()));
multicaster.multicastEvent(new FreeEvent(new Object()));
}

// 定义WorkEvent
public static class WorkEvent extends ApplicationEvent{
public WorkEvent(Object source){
super(source);
}
}
// 定义FreeEvent
public static class FreeEvent extends ApplicationEvent{
public FreeEvent(Object source){
super(source);
}
}

public static class MySmartListener implements SmartApplicationListener {
// WorkEvent和FreeEvent均可以处理
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> aClass) {
String workEventName = WorkEvent.class.getSimpleName();
String freeEventName = FreeEvent.class.getSimpleName();
return aClass.getSimpleName().equals(workEventName) || aClass.getSimpleName().equals(freeEventName);
}

// 对于属性源不加限制
@Override
public boolean supportsSourceType(Class<?> sourceType) {
return true;
}

@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
System.out.println("MySmartListener received event " + applicationEvent.getClass().getSimpleName());
}
}
}