概述
spring中的事件驱动模型也叫作发布订阅模式,是观察者模式的一个典型的应用
spring事件模型提供如下的类的概念:
- ApplicationListener: ApplicationListener继承自jdk的EventListener,所有的监听器都要实现这个接口,这个接口只有一个onApplicationEvent()方法,该方法接受一个ApplicationEvent或其子类对象作为参数,在方法体中,可以通过不同对Event类的判断来进行相应的处理.当事件触发时所有的监听器都会收到消息。
- ApplicationEvent: ApplicationEvent继承自jdk的EventObject,所有的事件都需要继承ApplicationEvent,并且通过source得到事件源.该类的实现类ApplicationContextEvent表示ApplicaitonContext的容器事件
- ApplicationEventPublisher: 事件的发布者,封装了事件发布功能方法接口,是Applicationcontext接口的超类
- ApplicationEventMulticaster: 属于事件广播器,它的作用是把Applicationcontext发布的Event广播给所有的监听器
事件机制工作流程图
event1.pngApplicationListener
@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 持有所有监听器对象,并可以动态增删事件监听器,同时具有在事件发布后广播通知事件监听器。
网友评论