Spring - 事件监听机制
Spring 事件驱动模型也是观察者模式很经典的应用。就是我们常见的项目中最常见的事件监听器。
一、Spring 中观察者模式的四个角色
1. 事件 - ApplicationEvent
ApplicationEvent 是所有事件对象的父类。ApplicationEvent 继承自 jdk 的 EventObject, 所有的事件都需要继承 ApplicationEvent, 并且通过 source 得到事件源。
Spring 也为我们提供了很多内置事件,ContextRefreshedEvent、ContextStartedEvent、ContextStoppedEvent、ContextClosedEvent。
如下图:
2. 事件监听 - ApplicationListener
ApplicationListener,也就是观察者,继承自 jdk 的 EventListener,该类中只有一个方法 onApplicationEvent。当监听的事件发生后该方法会被执行。
3. 事件源 - ApplicationContext
ApplicationContext 是 Spring 中的核心容器,在事件监听中 ApplicationContext 可以作为事件的发布者,也就是事件源。因为 ApplicationContext 继承自 ApplicationEventPublisher。
在 ApplicationEventPublisher 中定义了事件发布的方法:publishEvent(Object event)
4. 事件管理 - ApplicationEventMulticaster
用于事件监听器的注册和事件的广播。监听器的注册就是通过它来实现的,它的作用是把 Applicationcontext 发布的 Event 广播给它的监听器列表。
代码示例:
定义事件:
二、显示遍历观察者的问题
在 Spring Framework 和 Spring Boot 的事件监听机制中,事件的发布和监听机制通常并不直接涉及到在主题对象中显式地遍历观察者(或监听器)。相反,它们利用了 Spring 的应用上下文(ApplicationContext
)和事件发布机制来管理事件的发送和监听。
SimpleApplicationEventMulticaster
Spring 使用 SimpleApplicationEventMulticaster 作为事件广播器,它会负责将事件分发给所有注册的监听器
SimpleApplicationEventMulticaster 部分代码如下:
1 public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster { 2 3 //... 4 5 @Override 6 public void multicastEvent(ApplicationEvent event) { 7 multicastEvent(event, resolveDefaultEventType(event)); 8 } 9 10 @Override 11 public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) { 12 ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event)); 13 Executor executor = getTaskExecutor(); 14 for (ApplicationListener<?> listener : getApplicationListeners(event, type)) { 15 if (executor != null) { 16 executor.execute(() -> invokeListener(listener, event)); 17 } 18 else { 19 invokeListener(listener, event); 20 } 21 } 22 } 23 }
invokeListener中最终执行的是listener.onApplicationEvent(event);其实也就是执行ApplicationListener实现类的onApplicationEvent方法,里面的内容是监听器在事件发生时执行的特定逻辑