Java事件发布与监听

young 441 2021-10-25

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

创建监听器

  1. 监听器需ApplicationListener<? extends ApplicationEvent>接口,重写onApplicationEvent方法
  2. 通过@EventListener注解,标记监听处理方法
  3. 监听器需注册到Spring容器中

发布事件

发布事件通过ApplicationEventPublisher#publishEvent进行事件发布

Spring的监听器注册及发布均在SimpleApplicationEventMulticaster类中实现