1.概述
Spring中事件监听(也有说法叫事件通知)机制,其实本质是观察者模式的应用。当某个事件发生时,其会被广播出去,监听该实践的listener就会被触发然后执行响应的动作。该模式可良好应用于程序解耦,类似消息的发布订阅 它的事件监听机制基于ApplicationListener这个接口
由以上源码可以看出这个接口继承了java.util.EventListener 基于观察者模式 ApplicationListener的实现类会在spring容器启动的时候被发现
2.三种模式(事件、监听、发布)
2.1 事件
如下图所示,事件继承自EventObject类,该类维护了事件最初发生在其上的对象-source。而我们通常自定义的事件实际应继承自抽象类ApplicationEvent。比如常见的上下文刷新事件ContextRefreshedEvent
先定义一个事件类User
2.2 监听
自定义监听有两种实现方式:继承自ApplicationListener或者使用注解@EventListener
2.3 发布
有了事件与监听 ,那么还需要在某个时刻将事件广播出去触发监听动作 Spring提供了ApplicationEventPublisher接口 如下:
我们只需要注入ApplicationContext 然后发布就可以了 如下:
通过publishEvent发布触发事件
publishEvent方法会将我们的事件通知给监听器 这个场景叫做广播。也就是说,将该事件广播出去,但凡对该事件感兴趣的监听器均被通知到,这个逻辑是在AbstractApplicationContext的publishEvent中实现的,也就是说AbstractApplicationContext实现了ApplicationEventPublisher 接口的publishEvent方法
通过以上源码得知对event进行了处理,尝试转换为ApplicationEvent或PayloadApplicationEvent,如果是PayloadApplicationEvent则获取eventType 其次判断earlyApplicationEvents是否为空(也就是早期事件还没有被发布-说明广播器还没有实例化好),如果不为空则将当前事件放入否则获取ApplicationEventMulticaster调用其multicastEvent将事件广播出去。本文这里获取到的广播器实例是SimpleApplicationEventMulticaster。最后如果其parent不为null,则尝试调用父类publishEvent方法