一 定义方法

此接口主要是封装事件发布功能的接口,定义了两个方法:

    /**
* 通知应用所有已注册且匹配的监听器此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都是父类的不需要序列化的属性,添加了自身的事件发生时间的属性

transient作用: https://www.cnblogs.com/chenpi/p/6185773.html

三 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));//获取默认类型
} @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) {
executor.execute(() -> invokeListener(listener, event));
}
else {
invokeListener(listener, event);//调用对应的监听器逻辑方法
}
}
}

类中维护了一个Set,用来存放监听器,且监听事件都是异步线程池执行的.

springIOC源码接口分析(七):ApplicationEventPublisher的更多相关文章

  1. springIOC源码接口分析(三):ApplicationContext

    一 新增方法 主要都是获取容器基本信息的一些接口,比如获取名称,id和启动时间戳,获取AutowireCapableBeanFactory等接口 二 继承接口 ApplicationContext继承 ...

  2. springIOC源码接口分析(九):Environment

    先贴一下接口继承关系图,spring容器启动的时候会初始化环境,所以此接口相关接口非常有必要进行了解: 一 PropertyResolver接口 Environment继承了该接口,PropertyR ...

  3. springIOC源码接口分析(八):AutowireCapableBeanFactory

    参考博文: https://blog.csdn.net/f641385712/article/details/88651128 一 接口规范 从宏观上看,AutowireCapableBeanFact ...

  4. springIOC源码接口分析(十一):ConfigurableApplicationContext

    一 实现接口 关系图: ConfigurableApplicationContext接口实现了三个接口,ApplicationContext, Lifecycle, Closeable, Applic ...

  5. springIOC源码接口分析(六):ResourceLoader

    参考博客: https://www.cnblogs.com/jixp/articles/10702486.html 一 定义方法 Spring提供了ResourceLoader接口用于实现不同的Res ...

  6. springIOC源码接口分析(五):ListableBeanFactory

    一 继承关系 该接口是对BeanFactory的扩展,允许预加载bean定义的BeanFactory可以实现此接口 其目的在于使实现它的BeanFactory能够枚举所有的Bean 该接口不支持分层结 ...

  7. springIOC源码接口分析(四):MessageSource

    一 定义方法 MessageSource接口用于支持信息的国际化和包含参数的信息的替换 这个接口定义了三个方法: public interface MessageSource { /** * 解析co ...

  8. springIOC源码接口分析(二):ConfigurableBeanFactory

    一 继承功能 1 SingletonBeanRegistry接口 此接口是针对Spring中的单例Bean设计的.提供了统一访问单例Bean的功能,类中定义了以下方法: 2 HierarchicalB ...

  9. springIOC源码接口分析(一):BeanFactory

    一 应用场景 BeanFactory接口定义了IOC容器的最基本功能,提供了容器应该具有的功能规范,所有的容器都应该实现这个接口 BeanFactory设计了getBean方法用来获取容器中的Bean ...

随机推荐

  1. WWDC2018 之 高性能 Auto Layout

    1. 关于 Auto Layout 的历史渊源 上世纪 90 年代,名叫 Cassowary的布局算法,通过将布局问题抽象成线性不等式,并分解成多个位置间的约束,解决了用户界面的布局问题. Apple ...

  2. 网络知识02:TCP/IP概述

    一  DOD模型 传输控制协议IRI特网协议(TCP/IP)组是由美国国防部(DOD)所创建的,主要用来确保数据的完整性及在毁灭性战争中保持通信 是由一组不同功能的协议组合在一起的协议簇 利用一组协议 ...

  3. lintcode入门37-算法实现

    lintcode入门级算法题37 一.题目 反转一个3位整数 反转一个只有3位数的整数. 样例          样例 1: 输入: number = 123 输出: 321         样例 2 ...

  4. @程序员,你们还在用网上乱找的方法导入导出Excel么,我们给你造了个轮子!!!!!

    程序员的显著特点 有一天跟一位同事跟我闲聊,讨论起过去若干年软件行业的感受,他问了个问题:你觉得一个好的软件工程师最显著的特点是什么? 我想了一会,说:大概是坐得住吧. 某种意义上来说,在互联网技术飞 ...

  5. 从零开始のcocos2dx生活(八)ParticleSystemQuad

    https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/#_1 写的真的非常好-最近没时间拜读,只看 ...

  6. Spring MVC 请求处理过程

    1.  2. 3. 4. 5. 6.

  7. 「P5004」专心OI - 跳房子 解题报告

    题面 把\(N\)个无色格子排成一行,选若干个格子染成黑色,要求每个黑色格子之间至少间隔\(M\)个格子,求方案数 思路: 矩阵加速 根据题面,这一题似乎可以用递推 设第\(i\)个格子的编号为\(i ...

  8. 1065 单身狗 (25分)C语言

    单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数:随 ...

  9. Java实现上传文件到指定服务器指定目录

    前言需求 使用freemarker生成的静态文件,统一存储在某个服务器上.本来一开始打算使用ftp实现的,奈何老连接不上,改用jsch.毕竟有现成的就很舒服,在此介绍给大家. 具体实现 引入的pom ...

  10. mysql索引最佳实践

    索引最佳实践使用的表CREATE TABLE `employees` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(24) NOT ...