Spring 框架——事件驱动模型

这篇具有很好参考价值的文章主要介绍了Spring 框架——事件驱动模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.概述

(1)Spring 事件驱动模型是 Spring 框架中的一种编程模型,也被称为发布/订阅模型,通过使用观察者模式事件机制,实现了组件之间基于事件的解耦和通信。在 Spring 中,事件驱动模型建立在应用上下文事件 (ApplicationContextEvent) 的基础上。应用上下文事件是一种用于描述应用状态改变的事件,如应用上下文初始化完成、上下文刷新、上下文关闭等。

(2)通过事件驱动模型,Spring 框架提供了更灵活、松散耦合的方式来实现组件之间的通信和解耦。开发者可以定义自己的事件,并通过事件监听器来处理,实现自定义的业务逻辑,扩展框架的行为,并能够更容易地实现可测试、可维护和可扩展的应用程序。

有关观察者模式的相关知识可以参考Java 设计模式——观察者模式。

2.三种角色

2.1.事件角色

(1)事件是系统中发生的特定动作或者状态的表示。它可以是一个普通的 Java 对象,通常包含与该事件相关的数据和信息。例如,一个用户注册事件可以包含用户的姓名、邮箱等信息。

(2)在 Spring 中,org.springframework.context 包下的抽象类 ApplicationEvent 充当了事件的角色,它继承了 java.util.EventObject 类。并且Spring 中默认存在以下 4 种事件,它们都是继承了 ApplicationContextEvent 类(该类继承自 ApplicationEvent):

  • ContextClosedEvent:表示应用程序上下文关闭事件,触发时机是在应用程序上下文关闭时;
  • ContextRefreshedEvent:表示应用程序上下文刷新事件,触发时机是在应用程序上下文初始化及刷新完成后
  • ContextStartedEvent:表示应用程序上下文启动事件,触发时机是在应用程序上下文启动时;
  • ContextStoppedEvent:表示应用程序上下文停止事件,触发时机是在应用程序上下文停止时;

(3)上述类之间的关系如下图所示:

Spring 框架——事件驱动模型,Java 开发,Spring,事件驱动模型,观察者模式

2.2.事件监听者角色

接口 ApplicationListener 充当了事件监听者角色,其源码如下所示。该接口中定义了一个名为 onApplicationEvent() 的方法来处理事件 ApplicationEvent。因此,在 Spring 中我们只需该接口的 onApplicationEvent() 方法即可完成监听事件。

package org.springframework.context;

import java.util.EventListener;

@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
	/**
	 * Handle an application event.
	 * @param event the event to respond to
	 */
	void onApplicationEvent(E event);
}

2.3.事件发布者角色

接口 ApplicationEventPublisher 充当了事件发布者角色,其源码如下所示。该接口中的 publishEvent() 方法的具体实现是在AbstractApplicationContext 类中,具体细节此处就不再过多描述,感兴趣的读者可以去阅读其源码。

package org.springframework.context;

@FunctionalInterface
public interface ApplicationEventPublisher {
	default void publishEvent(ApplicationEvent event) {
		publishEvent((Object) event);
	}

	void publishEvent(Object event);
}

(2)在事件驱动模型中,发布者 (Publisher) 和订阅者 (Subscriber) 是模型的关键角色。发布者通过发布事件的方式进行通知,而订阅者通过订阅(订阅)事件的方式接收通知。发布者和订阅者之间的关系是松散耦合的,发布者不需要知道订阅者的具体细节,只需要发布事件,并由框架负责将事件传递给订阅者。

(3)在 Spring 框架中,应用上下文充当事件的发布者,而事件监听器 (Event Listener) 充当事件的订阅者。监听器可以通过实现 ApplicationListener 接口或使用 @EventListener 注解来订阅应用上下文事件。当事件被发布时,相应的监听器会接收到事件并执行相应的逻辑,实现事件驱动的编程。

3.示例

(1)使用 Spring 的事件驱动模型的一般步骤如下:

  • 定义事件:继承抽象类 ApplicationEvent,并且写相应的构造函数;
  • 定义事件监听者:实现 ApplicationListener 接口,重写 onApplicationEvent() 方法;
  • 定义事件发送者:发送者调用 ApplicationContext 中的 publishEvent 方法来发送事件消息;

(2)示例代码如下所示:文章来源地址https://www.toymoban.com/news/detail-578761.html

  • 首先,定义一个继承自 ApplicationEvent 的事件类 CustomEvent
import org.springframework.context.ApplicationEvent;

public class CustomEvent extends ApplicationEvent {

   private String message;

   public CustomEvent(Object source, String message) {
      super(source);
      this.message = message;
   }

   public String getMessage() {
      return message;
   }
}
  • 接下来,创建一个实现了 ApplicationListener 的事件监听器 CustomEventListener
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {
	@Override
	public void onApplicationEvent(CustomEvent customEvent) {
		String message = customEvent.getMessage();
		System.out.println("接收到的信息为: " + message);
	}
}
  • 然后,创建一个事件发布者 EventPublisher
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;

@Component
public class CustomPublisher {
	@Autowired
	private ApplicationContext applicationContext;
	
	public void publish(CustomEvent customEvent) {
		this.applicationContext.publishEvent(customEvent);
	}
}
  • 当调用 CustomPublisherpublish() 方法时,比如 customPublisher.publish(“Hello, World!”) ,控制台就会打印出:
接收到的信息为: Hello, World!

到了这里,关于Spring 框架——事件驱动模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Unity] No.3 EventManager事件管理 与 观察者模式

    前文讲到了InputManager,在其后需要一个事件的管理者用于调度任务的执行,包括: ①查看发生了什么事; ②出事后看看都需要通知谁干什么事; 以上两个内容就对应了EventManager中关键的 监听 和 回调 ,而在讲EventManager之前还需要知道,它是符合观察者这一模式的。 此处不

    2024年02月08日
    浏览(44)
  • Spring Event 观察者模式, 业务解耦神器

    观察者模式在实际开发过程中是非常常见的一种设计模式。 Spring Event的原理就是观察者模式,只不过有Spring的加持,让我们更加方便的使用这一设计模式。 概念 : 观察者模式又叫发布-订阅模式。 发布指的是当目标对象的状态改变时,它就向它所有的观察者对象发布 状态更

    2024年02月08日
    浏览(63)
  • 观察者模式(下):如何实现一个异步非阻塞的EventBus框架?

    上一节课中,我们学习了观察者模式的原理、实现、应用场景,重点介绍了不同应用场景下,几种不同的实现方式,包括:同步阻塞、异步非阻塞、进程内、进程间的实现方式。 同步阻塞是最经典的实现方式,主要是为了代码解耦;异步非阻塞除了能实现代码解耦之外,还能

    2024年02月16日
    浏览(35)
  • 设计模式——观察者模式(Observer Pattern)+ Spring相关源码

    类型:行为型模式 目的:当一个对象的状态发生改变时,其所有依赖者(观察者)都会收到通知并自动更新。 2.1.1 定义观察者 2.1.2 定义被观察对象 2.1.3 使用 2.2.1 观察者接口Observer 2.2.1 被观察者对象Observable 2.3.1 观察者 2.3.2 被观察者 创建型模式 结构型模式 1、设计模式——

    2024年02月06日
    浏览(47)
  • 用23种设计模式打造一个cocos creator的游戏框架----(十四)观察者模式

    模式名称:观察者模式 模式分类:行为型 模式意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 结构图: 适用于: 1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在

    2024年02月04日
    浏览(49)
  • java观察者模式

    在Java中实现观察者模式,可以通过使用Java内置的 java.util 包中的类来完成。下面是一个简单的示例: 首先,我们定义一个主题接口(Subject),其中包含注册观察者、移除观察者和通知观察者的方法: import java.util.Observer; public interface Subject {     void registerObserver(Observer obse

    2024年02月17日
    浏览(34)
  • 观察者模式(java)

    目录 结构 案例  代码实现 抽象观察者 抽象主题类 具体观察者 具体主题类 测试类 优缺点 优点 缺点 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一

    2024年02月15日
    浏览(35)
  • Java观察者设计模式

    观察者模式,定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在Java中,观察者模式通常由两个接口组成:Subject和Observer。Subject是被观察的对象,Observer是观察者。Subject接口定义了一系列方法,用于添加、删

    2024年02月16日
    浏览(36)
  • 浅谈Java中的观察者模式

    观察者模式是软件开发中常用的一种设计模式,它通过定义一对多的依赖关系,使得一个对象(主题)的状态变化可以通知多个其他对象(观察者)。 这种模式的优点是解耦和增加扩展性,用于实现对象之间的松耦合通信。 如果要自己编码实现,我们通常定义一个主题接口

    2024年02月11日
    浏览(36)
  • Java 设计模式——观察者模式

    观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式, 它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新 。 在观察者模式中有如下角色: Subject:观察对象 ,

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包