Spring中ApplicationListener事件监听机制详解

1.​概述

Spring中事件监听(也有说法叫事件通知)机制,其实本质是观察者模式的应用。当某个事件发生时,其会被广播出去,监听该实践的listener就会被触发然后执行响应的动作。该模式可良好应用于程序解耦,类似消息的发布订阅   它的事件监听机制基于ApplicationListener这个接口 

Spring中ApplicationListener事件监听机制详解_第1张图片

由以上源码可以看出这个接口继承了java.util.EventListener 基于观察者模式  ApplicationListener的实现类会在spring容器启动的时候被发现

2.三种模式(事件、监听、发布)

2.1 事件

如下图所示,事件继承自EventObject类,该类维护了事件最初发生在其上的对象-source。而我们通常自定义的事件实际应继承自抽象类ApplicationEvent。比如常见的上下文刷新事件ContextRefreshedEvent

Spring中ApplicationListener事件监听机制详解_第2张图片

先定义一个事件类User

Spring中ApplicationListener事件监听机制详解_第3张图片

2.2 监听

自定义监听有两种实现方式:继承自ApplicationListener或者使用注解@EventListener

Spring中ApplicationListener事件监听机制详解_第4张图片

Spring中ApplicationListener事件监听机制详解_第5张图片

2.3 发布

有了事件与监听 ,那么还需要在某个时刻将事件广播出去触发监听动作  Spring提供了ApplicationEventPublisher接口  如下:

Spring中ApplicationListener事件监听机制详解_第6张图片

我们只需要注入ApplicationContext   然后发布就可以了  如下:

Spring中ApplicationListener事件监听机制详解_第7张图片

通过publishEvent发布触发事件

Spring中ApplicationListener事件监听机制详解_第8张图片

publishEvent方法会将我们的事件通知给监听器  这个场景叫做广播。也就是说,将该事件广播出去,但凡对该事件感兴趣的监听器均被通知到,这个逻辑是在AbstractApplicationContext的publishEvent中实现的,也就是说AbstractApplicationContext实现了ApplicationEventPublisher 接口的publishEvent方法  

Spring中ApplicationListener事件监听机制详解_第9张图片

通过以上源码得知对event进行了处理,尝试转换为ApplicationEvent或PayloadApplicationEvent,如果是PayloadApplicationEvent则获取eventType 其次判断earlyApplicationEvents是否为空(也就是早期事件还没有被发布-说明广播器还没有实例化好),如果不为空则将当前事件放入否则获取ApplicationEventMulticaster调用其multicastEvent将事件广播出去。本文这里获取到的广播器实例是SimpleApplicationEventMulticaster。最后如果其parent不为null,则尝试调用父类publishEvent方法

你可能感兴趣的:(spring,java,后端)