首页 > 其他分享 >Spring - 事件监听机制

Spring - 事件监听机制

时间:2024-08-07 14:50:31浏览次数:9  
标签:Spring ApplicationEvent 监听 事件 监听器 机制 event

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方法,里面的内容是监听器在事件发生时执行的特定逻辑

标签:Spring,ApplicationEvent,监听,事件,监听器,机制,event
From: https://www.cnblogs.com/hld123/p/18347018

相关文章