Java事件机制的三个角色
-
事件源 source,事件发生的起源
-
事件对象 EventObject,持有一个事件源
-
事件监听器 EventListener,事件发生时的回调处理
示例
创建事件对象
public class TestEvent extends EventObject {
private String name;
public TestEvent(EventSource source,String name) {
super(source);
this.name = name;
}
public String getName() {
return name;
}
}
创建事件监听器
public interface TestListener extends EventListener {
void process(TestEvent event);
}
public class ListenerImpl implements TestListener{
@Override
public void process(TestEvent event) {
System.out.println("name:" + event.getName());
}
}
public class ListenerImplOther implements TestListener{
@Override
public void process(TestEvent event) {
System.out.println("Other name:" + event.getName());
}
}
创建事件源
public class TestEventPublishAndListener {
private List<TestListener> listenerList = new LinkedList<>();
public void addListener(TestListener listener){
listenerList.add(listener);
}
public void removeListener(TestListener listener){
listenerList.remove(listener);
}
public void test(TestEvent event){
for (TestListener listener : listenerList) {
listener.process(event);
}
}
}
测试
public static void main(String[] args) {
TestEventPublishAndListener publisher = new TestEventPublishAndListener();
// 注册监听器
publisher.addListener(new ListenerImpl());
publisher.addListener(new ListenerImplOther());
// 发布事件
publisher.test(new TestEvent(publisher,"111"));
}
name:111
other name:111
Spring事件发布与监听
创建事件对象
事件需继承ApplicationEvent
创建监听器
- 监听器需
ApplicationListener<? extends ApplicationEvent>
接口,重写onApplicationEvent
方法 - 通过
@EventListener
注解,标记监听处理方法 - 监听器需注册到Spring容器中
发布事件
发布事件通过ApplicationEventPublisher#publishEvent
进行事件发布
Spring的监听器注册及发布均在SimpleApplicationEventMulticaster
类中实现