Spring 中的发布-订阅模式

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

发布订阅模式是怎样的?

现在市面上流行的很多消息中间件就是采用的该种模式,这种模式 在实际业务中 将 事件发布者(Publisher) 与 事件订阅者 (Subscriber)通过额外的事件通道(Event Channel)来解耦,其基本原理与先前提到的观察者模式有些许类似,但发布订阅模式额外存在了Event Channel 的概念,也因此解决了 主题(Subject)和 Observer(观察者)之间的耦合,发布者和订阅者就交互细节上不再需要相互关联,下图可以看到两种模式之间的区别。

Spring 中的发布-订阅模式

在 Spring 中的实际应用

在Spring框架中,发布-订阅模式是通过事件驱动的方式实现的,用于解耦应用程序中的组件。Spring的事件机制允许应用程序中的各个部分以松散耦合的方式进行通信,这种方式在日常编码中最适合应对一些需要状态机的业务模型, 下面就来讲下 在 Spring 中的发布订阅涉及到的概念

  • 事件(Event):事件是应用程序中的状态变化或动作,对应于某个特定的行为或状态。在Spring中,事件通常是一个POJO(Plain Old Java Object)类,它包含了与该事件相关的信息。
  • 事件发布者(Event Publisher):事件发布者是负责发布事件的组件。在Spring中,ApplicationContext(应用程序上下文)充当了事件发布者的角色。通过ApplicationContext,应用程序可以发布事件,并将其传递给已注册的事件监听器。
  • 事件订阅者(Event Subscriber):事件订阅者是负责处理特定类型事件的组件。在Spring中,事件订阅者通常是实现了ApplicationListener接口的类,用于监听并处理发布的事件。
  • 事件推送(ApplicationEventPublisher):事件推送是指通过ApplicationEventPublisher接口在Spring中发布事件的过程。这个接口可以在ApplicationContext中使用,用于向已注册的监听器广播事件的发生。

设计步骤

  1. 定义事件类:首先,定义应用中的各种事件,这些事件可以是任何与应用状态变化或行为相关的事情。事件通常是简单的POJO类。
  2. 定义发布者:创建事件发布者(Publisher)组件,它负责发布事件。在Spring中,你可以使用ApplicationEventPublisher接口或者直接在Bean方法上标注@EventListener注解来实现。
  3. 定义订阅者:创建事件订阅者(Subscriber)组件,它负责订阅感兴趣的事件并对事件做出响应。在Spring中,你可以定义实现ApplicationListener接口的类来作为事件监听器,或者使用@EventListener注解在方法上订阅事件。
  4. 触发事件:在适当的时候,通过发布者发布事件。一旦事件被发布,所有已经注册的订阅者将会收到事件通知并执行相应的逻辑。

这里会以简单的 用户注册的场景来介绍下 Spring ApplicationEventPublisher 的使用方式

定义事件类UserRegisteredEvent

import org.springframework.context.ApplicationEvent;

public class UserRegisteredEvent extends ApplicationEvent {
    private final String username;

    public UserRegisteredEvent(Object source, String username) {
        super(source);
        this.username = username;
    }

    public String getUsername() {
        return username;
    }
}



创建UserRegistrationService服务,负责注册新用户并发布事件

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;

@Service
public class UserRegistrationService {

    @Autowired
    private ApplicationEventPublisher eventPublisher;

    public void registerUser(String username) {
        // 注册新用户逻辑
        // ...

        // 发布用户注册事件,这里使用 eventPublisher 将 预先定义好的事件交由 Spring 的Event Channel 管理
        eventPublisher.publishEvent(new UserRegisteredEvent(this, username));
    }
}

创建UserNotificationService服务,订阅UserRegisteredEvent事件并发送通知
@Service
public class UserNotificationService {

    @EventListener
    public void handleUserRegisteredEvent(UserRegisteredEvent event) {
        // 处理用户注册事件,例如发送通知
        String username = event.getUsername();
        System.out.println("Notification sent for user: " + username);
    }
}

创建 Spring 启动类
@SpringBootApplication
@RequiredArgsConstructor
public class Application implements CommandLineRunner {

    private  final UserRegistrationService userRegistrationService;

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.setWebApplicationType(WebApplicationType.NONE);
        app.run(args);
    }

    @Override
    public void run(String... args) {
        // 在启动时注册新用户
        userRegistrationService.registerUser("peng");
    }
}

最后程序的输出结果 如下所示:

Notification sent for user: peng

案例中的代码已发布在 github仓库 , 路径为package com.github.meeting.demo.pattern.pubsub;.文章来源地址https://www.toymoban.com/news/detail-855068.html

到了这里,关于Spring 中的发布-订阅模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • js设计模式:发布订阅模式

    也称之为消息队列模式,或者pubsub模式 发布者发布消息(也可以理解为调用某函数),订阅者会收到消息,并且发布者可以将一些参数传递给订阅者。 是一种常用的参数传递方法,经典的pubsub.js,vue2中的$bus等都是用的这种模式。

    2024年02月19日
    浏览(31)
  • 观察者模式和发布订阅模式

    观察者模式与发布订阅模式的区别: 1、观察者模式中只有观察者和被观察者,发布订阅模式中有发布者、订阅者、调度中心 2、观察者模式是被观察者发生变化时自己通知观察者,发布订阅模式是通过调度中心来进行分布订阅操作 vue2中响应式数据就是由Object.defineProperty()和

    2024年02月13日
    浏览(32)
  • js设计模式——发布订阅模式

    一、概述 发布订阅模式是一种常用的设计模式,它定义了一种一对多的关系,让多个订阅者对象同时监听某一个主题对象,当主题对象发生变化时,它会通知所有订阅者对象,使它们能够自动更新 。 二、优缺点 1. 优点: 实现了发布者和订阅者之间的解耦,提高了代码的可

    2024年02月06日
    浏览(27)
  • 行为型:发布订阅模式

      发布订阅模式是基于一个事件(主题)通道,希望接收通知的对象 Subscriber (订阅者) 通过自定义事件订阅主题,被激活事件的对象 Publisher (发布者) 通过发布主题事件的方式通知订阅者 Subscriber (订阅者) 对象。   简单说就是 发布者与订阅者通过事件来通信 ,

    2023年04月11日
    浏览(27)
  • 观察者模式, 发布-订阅模式, 监听器模式

    观察者模式是一种 行为型 设计模式, 定义对象间的一种 一对多 的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 角色模型和结构图 在观察者模式中,只有两种主体:目标对象 ( Object ) 和 观察者 ( Observer )。宗门任务大殿就是目标对象

    2024年02月22日
    浏览(30)
  • 观察者模式和发布订阅模式的区别

    从下图中可以看出, 观察者模式中观察者和目标直接进行交互,而发布订阅模式中统一由调度中心进行处理,订阅者和发布者互不干扰 。这样一方面实现了 解耦 ,还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息,但是不想所有的订阅者都接收到,就可以

    2024年02月22日
    浏览(36)
  • 设计模式之观察者(发布订阅)模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己 观察者模式主要解决的问题: 当一个对象状态发生改变后给其他的对象通知 观察者的优点: 观察者和

    2024年02月07日
    浏览(29)
  • 微信小程序 -订阅发布模式

    图形展示: 代码展示: 1. 安装模块 pubsub-js 2. 导入模块(在需要订阅发布的 js 页面内进行导入) 注:在微信小程序中无法直接npm 下载 导入 的(安装一个就需要构建一次) 解决: 菜单栏 -- 工具 --  构建 npm   点击即可(会出现新的目录) 详情页: 1. 绑定两个事件,用于

    2024年02月04日
    浏览(27)
  • RabbitMQ发布与订阅模式类型

    🍁博客主页:👉不会压弯的小飞侠 ✨欢迎关注:👉点赞👍收藏⭐留言✒ ✨系列专栏:👉Linux专栏 🔥欢迎大佬指正,一起学习!一起加油! 工作队列背后的假设是每个任务都是 只交付给一名工人。在这一部分中,我们将做一些事情 完全不同的 - 我们将向多个传递消息 消

    2024年02月02日
    浏览(32)
  • redis发布订阅模式的应用

    小体量系统,某些特定场景需要做异步处理。如操作日志记录、发送消息、数据excel导入等。并发量不大,主要作用是异步批处理数据,提高响应速度,改善用户体验,不至于页面卡半天。用消息队列的话显得很笨重,牛刀杀鸡,不利于项目的快速布署和影响项目稳定。在这

    2024年02月11日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包