Spring之事件机制模型

概述

spring中的事件驱动模型也叫作发布订阅模式,是观察者模式的一个典型的应用

spring事件模型提供如下的类的概念:

  1. ApplicationListener: ApplicationListener继承自jdk的EventListener,所有的监听器都要实现这个接口,这个接口只有一个onApplicationEvent()方法,该方法接受一个ApplicationEvent或其子类对象作为参数,在方法体中,可以通过不同对Event类的判断来进行相应的处理.当事件触发时所有的监听器都会收到消息。
  2. ApplicationEvent: ApplicationEvent继承自jdk的EventObject,所有的事件都需要继承ApplicationEvent,并且通过source得到事件源.该类的实现类ApplicationContextEvent表示ApplicaitonContext的容器事件
  3. ApplicationEventPublisher: 事件的发布者,封装了事件发布功能方法接口,是Applicationcontext接口的超类
  4. ApplicationEventMulticaster: 属于事件广播器,它的作用是把Applicationcontext发布的Event广播给所有的监听器

事件机制工作流程图

event1.png

ApplicationListener

@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {

    /**
     * 当前事件event发布时触发此方法,此方法用于监听事件的发布
     */
    void onApplicationEvent(E event);

}

ApplicationListener 事件监听器的超级接口,所有事件监听器继承实现与此类

ApplicationEvent

public abstract class ApplicationEvent extends EventObject {

    /** 事件发生的时间 */
    private final long timestamp;

    public ApplicationEvent(Object source) {
        super(source);
        this.timestamp = System.currentTimeMillis();
    }

    public final long getTimestamp() {
        return this.timestamp;
    }

}

ApplicationEvent 事件的超类,所有事件基于此类实现

ApplicationEventPublisher

@FunctionalInterface
public interface ApplicationEventPublisher {

    /**
     * 发布事件
     */
    default void publishEvent(ApplicationEvent event) {
        publishEvent((Object) event);
    }

    /**
     * 发布事件
     */
    void publishEvent(Object event);

}

ApplicationEventPublisher 事件发布功能接口,用于提供发布事件的能力接口,为Applicationcontext接口的超类

ApplicationEventMulticaster

public interface ApplicationEventMulticaster {
    /**
     * 添加给定监听器集合
     */
    void addApplicationListener(ApplicationListener<?> listener);

    /**
     * 添加给定名称的事件监听器
     */
    void addApplicationListenerBean(String listenerBeanName);

    /**
     * 移除给定事件监听器集合
     */
    void removeApplicationListener(ApplicationListener<?> listener);

    /**
     * 移除名称为listenerBeanName的事件监听器
     */
    void removeApplicationListenerBean(String listenerBeanName);

    /**
     * 移除所有事件监听器
     */
    void removeAllListeners();

    /**
     * 事件发布后通知监听器执行onApplicationEvent方法
     */
    void multicastEvent(ApplicationEvent event);

    /**
     * 事件发布后通知监听器执行onApplicationEvent方法
     */
    void multicastEvent(ApplicationEvent event, @Nullable ResolvableType eventType);

}

ApplicationEventMulticaster 持有所有监听器对象,并可以动态增删事件监听器,同时具有在事件发布后广播通知事件监听器。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 文章较长,建议先收藏,在较空的时候来看。 Spring Boot 框架的初衷:快速地启动Spring应用Sprin...
    Drew_Zhong阅读 2,811评论 3 15
  • 远古时候起,人类的基因里就留下了面对危险局面时要选择“打”或是“逃”的选择倾向。碰到让自己害怕的就逃,不怕的就打。...
    有鱼上上签阅读 228评论 0 1
  • 标识符可以用来标识变量名、类名、类中的方法名和文件名等。 命名规则: (1) 由字母、数字、下...
    0f3e6c40735f阅读 208评论 0 0
  • 派出所。 十七岁的阳子,低垂着头,躬着身子,羞涩的捂着眼睛,眼泪不停地往下掉。坐在对面的两个女民警极尽温和的劝慰着...
    小猫说法阅读 457评论 0 4
  • 看过一句话:怕深秋的树,怕初冬的雨,怕猜不透的人心,怕想不到的未来。怕你不在以后,偏偏还要路过以前的地方。
    momo2015阅读 350评论 0 0