springIOC源码接⼝分析(七):ApplicationEventPublisher ⼀定义⽅法
此接⼝主要是封装事件发布功能的接⼝,定义了两个⽅法:
/**
* 通知应⽤所有已注册且匹配的此ApplicationEvent
*/
default void publishEvent(ApplicationEvent event) {
publishEvent((Object) event);
}
/**
* 通知应⽤所有已注册且匹配的此Event ,
* 如果这个Event不是⼀个ApplicationEvent,则其被包裹于PayloadApplicationEvent
*/
void publishEvent(Object event);
⼆ ApplicationEvent 事件抽象类
spring中ApplicationEvent +ApplicationListener 是观察者模式的⼀种实现。
public abstract class ApplicationEvent extends EventObject {
/** use serialVersionUID from Spring 1.2 for interoperability. */
private static final long serialVersionUID = 7099057708183571937L;
/** 事件发⽣的系统时间 */
private final long timestamp;
// 构造器
public ApplicationEvent(Object source) {//发⽣事件的对象
super(source);
this.timestamp = System.currentTimeMillis();
}
public final long getTimestamp() {
return this.timestamp;
}
}
ApplicationEvent类继承了EventObject类 ,构造器中的source都是⽗类的不需要序列化的属性,添加了⾃⾝的事件发⽣时间的属性
三 spring内置事件
spring⾥⾯有许多Event的实现,包括springBoot⾥⾯⼜新增了⼀些实现,下⾯是这些实现:
ApplicationEvent的实现主要分为三条线:
1 PayloadApplicationEvent,是可以使⽤泛型的事件,不⽤进⾏强转
2 ApplicationContextEvent以及其四个⼦类
ApplicationContextEvent是对应应⽤上下⽂的事件,主要有四个事件,分别是:
ContextRefreshedEvent  刷新
ContextClosedEvent  关闭
ContextStartedEvent  启动
ContextStoppedEvent  暂停
3 RequestHandledEvent,对应http服务事件,其实现类定义了⼀些http请求有关的参数,url,状态code等:
三 ApplicationListener 接⼝
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
/**
* Handle an application event.
* @param event the event to respond to
*/
void onApplicationEvent(E event);
}
ApplicationListener接⼝继承了EventListener 接⼝,java中所有的都继承了这个接⼝猛兽jdk,util包下⾯的接⼝,接⼝接受ApplicationEvent的⼦类作为监听事件.使⽤⼀般有两种⽅式:
⼀实现ApplicationListener接⼝
⽐如spring内置的⼀个:
⼆使⽤@EventListener注解的⽅式
注册了之后,发布对应事件就会通过事件处理器管理类多播到对应的监听逻辑,即onApplicationEvent⽅法
四 ApplicationEventMulticaster 事件处理器管理类
ApplicationEventMulticaster接⼝定义了7个管理的⽅法,只有⼀个实现类SimpleApplicationEventMulticaster,⽅法分别是:
/**
* 添加,⽤来接收所有事件的通知
*/
void addApplicationListener(ApplicationListener<?> listener);
/**
* 根据Bean名称添加
*/
void addApplicationListenerBean(String listenerBeanName);
/**
* 移除
*/
void removeApplicationListener(ApplicationListener<?> listener);
/**
* 根据名称移除
*/
void removeApplicationListenerBean(String listenerBeanName);
/**
* 移除所有
*/
void removeAllListeners();
/**
* 将事件⼴播到对应的中
*/
void multicastEvent(ApplicationEvent event);
/**
* 将事件⼴播到对应的中
*/
void multicastEvent(ApplicationEvent event, @Nullable ResolvableType eventType);
接下来看实现类中⼴播事件的⽅法:
@Override
public void multicastEvent(ApplicationEvent event) {
multicastEvent(event, resolveDefaultEventType(event));//获取默认类型
spring ioc注解}
@Override
public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
//获取所有注册的,并遍历
for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
Executor executor = getTaskExecutor();
if (executor != null) {
}
else {
invokeListener(listener, event);//调⽤对应的逻辑⽅法
}
}
}
类中维护了⼀个Set,⽤来存放,且监听事件都是异步线程池执⾏的.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。