一篇文章读懂SimpleApplicationEventMulticaster

SimpleApplicationEventMulticaster

基于 springboot3.2 和 springframework6.1.4

简介

观察者设计模式

Spring 框架中的事件机制是观察者设计模式的一个典型实现,它基于发布-订阅模式(Publish-Subscribe)。在 Spring
中,事件是由事件发布者(ApplicationEventPublisher)发布的,而事件监听器(ApplicationListener)则是观察者,负责处理特定类型的事件。

以下是 Spring 框架中事件机制的主要组成部分:

  1. 事件(Event):

    • 事件是应用程序中可能发生的事情,它通常是一个继承自 ApplicationEvent 的类。
    • 开发人员可以定义自己的事件类,以便在应用程序中传递关键信息。
  2. 事件发布者(ApplicationEventPublisher):

    • ApplicationEventPublisher 接口是事件发布者的标准接口,它定义了发布事件的方法 publishEvent(Event event)
    • Spring 中的容器,如 ApplicationContext,实现了这个接口,允许在应用程序中发布事件。
  3. 事件监听器(ApplicationListener):

    • ApplicationListener 接口是事件监听器的标准接口,它定义了用于处理事件的方法 onApplicationEvent(Event event)
    • 开发人员可以实现这个接口,以便在事件发生时执行自定义的逻辑。
  4. 事件广播器(ApplicationEventMulticaster):

    • 事件广播器是框架内部的组件,负责将事件分发给所有注册的监听器。
    • Spring 提供了多个事件广播器的实现,其中 SimpleApplicationEventMulticaster 是一个简单的单线程实现。

下面是一个简单的 Spring 事件机制的示例:

// 1. 定义事件
public class MyCustomEvent extends ApplicationEvent {
   
    public MyCustomEvent(Object source) {
   
        super(source);
    }

    // 可以添加自定义的方法和属性
}

// 2. 定义事件监听器
public class MyCustomEventListener implements ApplicationListener<MyCustomEvent> {
   
    @Override
    public void onApplicationEvent(MyCustomEvent event) {
   
        // 处理事件的逻辑
        System.out.println("Received Custom Event: " + event.toString());
    }
}

// 3. 在应用程序中发布事件
public class EventPublisher {
   
    @Autowired
    private ApplicationEventPublisher eventPublisher;

    public void publishCustomEvent() {
   
        MyCustomEvent event = new MyCustomEvent(this);
        eventPublisher.publishEvent(event);
    }
}

在上述示例中,MyCustomEvent 是一个自定义的事件类,MyCustomEventListener
是一个事件监听器。通过 ApplicationEventPublisher 接口,EventPublisher 类可以在应用程序中发布 MyCustomEvent
事件。当事件被发布时,所有注册的监听器(比如 MyCustomEventListener)都会收到通知并执行相应的处理逻辑。

这个例子展示了 Spring 框架中事件机制如何实现观察者设计模式,通过事件的发布者和监听器之间的松耦合关系,实现了一对多的通知机制。

ApplicationEventPublisher 和 ApplicationEventMulticaster

ApplicationEventPublisherApplicationEventMulticaster 是 Spring 框架中两个不同的接口,但它们在事件处理中有一定的关系。

  1. ApplicationEventPublisher:

    • ApplicationEventPublisher 是一个接口,定义了事件发布者的行为。它负责将事件通知给注册的监听器。
    • 其主要方法是 publishEvent(ApplicationEvent event),用于发布一个应用事件,将事件传递给所有注册的监听器。
    public interface ApplicationEventPublisher {
         
        void publishEvent(ApplicationEvent event);
        // ...
    }
    
  2. ApplicationEventMulticaster:

    • ApplicationEventMulticaster 也是一个接口,定义了事件广播器的行为。它负责将事件广播给所有注册的监听器。
    • ApplicationEventMulticaster 的实现决定了事件是同步还是异步传播,以及其他一些广播策略。
    public interface ApplicationEventMulticaster {
         
        void addApplicationListener(ApplicationListener<?> listener);
        void removeApplicationListener(ApplicationListener<?> listener);
        void multicastEvent(ApplicationEvent event);
        // ...
    }
    

在 Spring 中,ApplicationEventPublisher 接口通常由 Spring 容器(如 ApplicationContext
)实现,而 ApplicationEventMulticaster 接口通常由一个具体的实现类(如 SimpleApplicationEventMulticaster)来处理事件的多播。

当你使用 ApplicationEventPublisher 发布事件时,底层通常会使用 ApplicationEventMulticaster 来实际进行事件的广播。Spring
提供了多个实现了 ApplicationEventMulticaster
接口的类,可以根据应用程序的需求选择合适的实现。SimpleApplicationEventMulticaster
是其中一个简单的实现,而 AsyncEventMulticaster 则支持异步事件传播。

SimpleApplicationEventMulticaster

SimpleApplicationEventMulticaster 是 Spring Framework 中用于处理事件(Event)的一个简单的事件广播器(Event
Multicaster)实现之一。在 Spring
中,事件驱动编程是通过使用观察者设计模式来实现的,其中事件是由发布者(Publisher)产生并由订阅者(Subscriber)处理。事件广播器负责将事件传递给所有注册的监听器,以便它们可以相应地处理这些事件。

以下是对 SimpleApplicationEventMulticaster 的主要介绍:

  1. 实现方式: SimpleApplicationEventMulticaster 实现了 ApplicationEventMulticaster 接口,该接口定义了事件广播器的基本行为。

  2. 单线程模型: SimpleApplicationEventMulticaster
    是一个单线程的事件广播器,它按照注册的监听器的顺序同步地触发事件。这意味着事件广播是在同一个线程中进行的,一个监听器的处理过程会完全执行完毕后才会继续下一个监听器。

  3. 同步处理: 事件的广播是同步的,即发布者发布事件时,会阻塞直到所有注册的监听器都处理完该事件。

  4. 注册监听器: 通过 addApplicationListener 方法可以向 SimpleApplicationEventMulticaster
    注册监听器,这些监听器必须实现 ApplicationListener 接口。

  5. 触发事件: 使用 multicastEvent 方法触发事件,它将事件传递给所有注册的监听器。

使用示例:

// 创建事件
MyCustomEvent event = new MyCustomEvent(source);

// 创建 SimpleApplicationEventMulticaster
SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster();

// 注册监听器
eventMulticaster.

addApplicationListener(new MyCustomEventListener());

// 触发事件
        eventMulticaster.

multicastEvent(event);

需要注意的是,SimpleApplicationEventMulticaster 是一个简单的事件广播器实现,适用于小型应用或不需要复杂事件处理机制的情况。对于大型应用或需要更高级特性的情况,Spring
提供了其他更复杂的事件广播器实现,如 AsyncEventMulticaster 等。

ApplicationListener是Spring框架中的一个接口,用于监听应用程序的生命周期事件。它定义了一组回调方法,可以在应用程序启动、停止或重新加载时执行相应的逻辑。

ApplicationListener

ApplicationListener
接口有一个泛型参数,用于指定要监听的事件类型。当应用程序发布与指定事件类型相匹配的事件时,实现了ApplicationListener
接口的类将被通知并执行相应的回调方法。

以下是ApplicationListener接口的常用回调方法:

onApplicationEvent(ApplicationEvent event):该方法在监听到指定事件类型被调用,参数event是触发的事件对象。
supportsEventType(Class<? extends ApplicationEvent> eventType):该方法用于判断是否持监听指定事件类型。
supportsSourceType(Class<?> sourceType):该方法用于判断是否支持监听指定事件源类型。
通过实现ApplicationListener接口,可以在应用程序的不同生命周期阶段执行自定义的逻辑,在应用程序启动时进行初始化操作,或在应用程序停止时进行资源释放。

SimpleApplicationEventMulticaster 类图

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
de.schlichtherle.license.LicenseContentException: exc.licenseHasExpired at de.schlichtherle.license.LicenseManager.validate(LicenseManager.java:629) at com.keyunzhihui.auth.license.CustomLicenseManager.validate(CustomLicenseManager.java:101) at com.keyunzhihui.auth.license.CustomLicenseManager.install(CustomLicenseManager.java:83) at de.schlichtherle.license.LicenseManager.install(LicenseManager.java:406) at de.schlichtherle.license.LicenseManager.install(LicenseManager.java:382) at com.keyunzhihui.auth.license.LicenseVerify.install(LicenseVerify.java:44) at com.keyunzhihui.auth.license.LicenseVerify.install(LicenseVerify.java:33) at com.keyunzhihui.auth.listener.LicenseRunListener.onApplicationStartEvent(LicenseRunListener.java:59) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:344) at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:229) at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:166) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) at org.springframework.boot.context.event.EventPublishingRunListener.started(EventPublishingRunListener.java:105) at org.springframework.boot.SpringApplicationRunListeners.lambda$started$5(SpringApplicationRunListeners.java:75) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:117) at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:111) at org.springframework.boot.SpringApplicationRunListeners.started(SpringApplicationRunListeners.java:75) at org.springframework.boot.SpringApplication.run(SpringApplication.java:345) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1318) at com.kyzh.business.doorlock.DoorLockServiceApplication.main(DoorLockServiceApplication.java:42)
最新发布
07-08

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值