Spring 事件使用-观察者、发布/订阅模式

spring boot 观察者设计模式代码实现教程 首先,我们需要创建一个自定义事件类,这个类需要继承类。} }} }} } 阅读详情

Spring 事件使用-观察者、发布/订阅模式


当系统从小到大演变过程,小的系统一个需求可能就2行代码就解决了,当不断添加新的需求或功能原有的代码就会越来越多,各种 if else语句各种循环,就算将一些功能抽离出使用新的方法,代码的可读性依然会随着系统的功能膨胀变得越来越低,扩展性、可维护性显得越来越重要,设计模式显得也就越来越重要。

本章介绍下,Spring 事件使用及观察者模式,如果对观察者模式有所了解可以直接调到Spring事件

Spring版本最好在4.2以上,低版本有些功能(注解)可能不支持。

观察者模式定义

一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

类图
在这里插入图片描述

对于刚刚接触设计模式的童鞋来说,看到它的定义和类图是一脸懵逼,千万不要死记硬背,就算记住了没有理解它的使用场景,在正式开发过程中根本想不到使用它,或变成了为了使用设计模式而使用设计模式。

MQ(消息队列中间件)就是这个设计模式的实现,如:RabbitMQ、ActiveMQ、Kafka等等;将一段消息发送到MQ继续处理其他逻辑,不需要关心消息是否被处理。

自定义观察者模式

自定义实现观察者模式,所有对象的创建交给Spring容器

主题类Subject

package com.example.custom;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
/**
 * 观察的主题,主题发生变化通知所用观察者
 * @author: sunshaoping
 * @date: Create by in 15:29 2018-11-13
 */
@Component
public class Subject {
    private final List<Observer> observerList;
    /**
     * Spring 容器中所有实现Observer接口的实例
     * @param observerList 所有实现Observer接口的实例
     */
    @Autowired
    public Subject(List<Observer> observerList) {
        this.observerList = observerList;
    }
    /**
     * 通知观察者
     * @param content 通知内容
     */
    public void notify(String content) {
        //通知全部观察者
        for (Observer observer : observerList) {
            observer.update(content);
        }
    }
}

观察者接口Observer

package com.example.custom;

/**
 * 观察者/监听者
 * @author: sunshaoping
 * @date: Create by in 15:25 2018-11-13
 */
public interface Observer {
    /**
     * 被观察者发布通知时,调用改方法
     * @param content 通知内容,此处使用的是String,它可以是任意对象
     */
    void update(String content);

}

观察者1实现

package com.example.custom;

import org.springframework.stereotype.Component;

/**
 * 观察者1
 * @author: sunshaoping
 * @date: Create by in 15:42 2018-11-13
 */
@Component
public class ObserverOne implements Observer {

    @Override
    public void update(String content) {
        System.out.println("我是观察者1,得到了通知:" + content);
    }
}

观察者2实现

package com.example.custom;

import org.springframework.stereotype.Component;

/**
 * 观察者2
 * @author: sunshaoping
 * @date: Create by in 15:42 2018-11-13
 */
@Component
public class ObserverTwo implements Observer {

    @Override
    public void update(String content) {
        System.out.println("我是观察者2,得到了通知:" + content);
    }
}

发布通知测试

package com.example.custom;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.Assert.*;

/**
 * @author: sunshaoping
 * @date: Create by in 15:48 2018-11-13
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class SubjectTest {

    @Autowired
    Subject subject;

    @Test
    public void notify1() {
        subject.notify("您的支付宝到账100W ");
        subject.notify("您的工资发放 10W ");
    }
}

运行结果

我是观察者1,得到了通知:您的支付宝到账100W 
我是观察者2,得到了通知:您的支付宝到账100W 
我是观察者1,得到了通知:您的工资发放 10W 
我是观察者2,得到了通知:您的工资发放 10W 

这里只列举了一个主题和两个观察者,观察者可以任意增加,不影响现有的代码的逻辑,这就是设计模式的好处。

Java API观察者模式

其实java1.0就有了对观察者模式的实现,发展到现在基本上已经废弃了(java11已经废弃),但是并不影响我们使用它对观察者模式的讲解。

只需要实现一个观察者接口(Observer)和继承一个可观察类(Observable),分别对应自定义观察者模式 Observer(观察者)和Subject(主题),下面是简单的实现

可观察类:MyObservable

package com.example.java;

import java.util.Observable;

public class MyObservable extends Observable {
    public MyObservable() {
        setChanged();
    }
}

观察者:MyObserver

package com.example.java;

import java.util.Observable;
import java.util.Observer;

public class MyObserver implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("java 观察者,收到 :" + arg);
    }
}

测试类:Test

package com.example.java;

import java.util.Observable;

public class Test {

    public static void main(String[] args) {
        Observable observable = new MyObservable();
        //添加观察者
        observable.addObserver(new MyObserver());
        //发布消息
        observable.notifyObservers("您的快递到了,请下楼领取 ");


    }
}

是不是实现原理基本上是一样的。

Spring事件

正式进入主题Spring事件机制,

首先我们体验下我们订单为例

事件初体验

业务场景:监听订单创建时锁定指定商品

订单实体,省略get/set方法

public class Order {
    /**
     * 订单编号
     */
    private String orderNo;

    /**
     * 订单状态
     */
    private String orderStatus;
    /**
     * 商品
     */
    private String goods;
    /**
     * 创建时间
     */
    private LocalDateTime createTime;
}

订单Service,保存订单逻辑处理

@Service
public class OrderService implements ApplicationEventPublisherAware {

    private ApplicationEventPublisher applicationEventPublisher;

    /**
     * 订单保存
     */
    public void save(Order order) {
        //生成订单号
        String orderNo = getOrderNo();
        order.setOrderNo(orderNo);
        order.setOrderStatus("待付款");
        order.setCreateTime( LocalDateTime.now());
        System.out.println("订单保存成功:" + order);
        //发布订单创建事件
        applicationEventPublisher.publishEvent(new OrderCreateEvent(this, order));

    }

    private String getOrderNo() {
        String millis = String.valueOf(System.currentTimeMillis());
        String str = millis.substring(millis.length() - 7, millis.length() - 1);
        return LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + str;
    }

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {

        this.applicationEventPublisher = applicationEventPublisher;
    }
}

订单创建对象,实现ApplicationEvent接口

public class OrderCreateEvent extends ApplicationEvent {

    private final Order order;

    public OrderCreateEvent(Object source, Order order) {
        super(source);
        this.order = order;
    }

    public Order getOrder() {
        return order;
    }
}

订单事件监听,实现ApplicationListener接口,锁定商品

@Component
public class OrderCreateEventListener implements ApplicationListener<OrderCreateEvent> {


    @Override
    public void onApplicationEvent(OrderCreateEvent event) {
        System.out.printf("ApplicationListener 接口实现,订单号[%s]:,锁定商品[%s]\n",
                event.getOrder().getOrderNo(), event.getOrder().getGoods());
    }
}

使用起来是不是很简单,而且它是Spring一个功能只要是Spring项目就可以使用(基本java项目都在使用Spring),这部分只展示了它的功能的小小一块。

简单的 Application Event

事件对象实现ApplicationEvent抽象类,如果上面的订单创建事件对象OrderCreateEvent

public class OrderCreateEvent extends ApplicationEvent 

监听类实现ApplicationListener<OrderCreateEvent>通过泛型的方式 OrderCreateEventListener

发布这个事件

applicationEventPublisher.publishEvent(new OrderCreateEvent(this, order));

上面是最简单Spring 事件实现方式。

注解驱动 @EventListener

事件监听不在用ApplicationListener接口,而是基于注解@EventListener驱动

@Component
public class OrderCreateEventListenerAnnotation {
    
    @EventListener
    public void orderCreateEvent(OrderCreateEvent event) {
        System.out.println("订单创建事件,@EventListener 注解驱动实现");
    }
}

实现起来是不是很简单

如果在方法内没有使用事件对象,方法上也可以去掉它,但是要指定这个方法监听的是哪个事件类。如:

@Component
public class OrderCreateEventListenerAnnotation {
    @EventListener(OrderCreateEvent.class)
    public void orderCreateEvent() {
        System.out.println("订单创建事件,@EventListener 注解驱动实现");
    }
}
条件事件

在一些时候可能只要满足某些条件才进行对事件监听,这时就可以用@EventListener#condition属性来指定条件,条件是一个SpEL表达式,关于SpEL请参考baeldung SpEL 或官网SpEL

只有订单状态是待付款才监听才有效。

@EventListener(condition = "#event.order.orderStatus eq '待付款'")
public void orderCreateEventCondition(OrderCreateEvent event) {
    System.out.println("订单创建事件,@EventListener 注解驱动实现");
}

异步事件

覆盖默认ApplicationEventMulticaster,通过源码就可以知道它的原理

AbstractApplicationContext#initApplicationEventMulticaster初始化方法

/**
 * Initialize the ApplicationEventMulticaster.
 * Uses SimpleApplicationEventMulticaster if none defined in the context.
 * @see org.springframework.context.event.SimpleApplicationEventMulticaster
 */
protected void initApplicationEventMulticaster() {
   ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    //IOC容器中存在
    //beanName=APPLICATION_EVENT_MULTICASTER_BEAN_NAME("applicationEventMulticaster")
    //使用容器中的对象
   if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
      this.applicationEventMulticaster =
            beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
      if (logger.isTraceEnabled()) {
         logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
      }
   }
   else {
       //否则使用 SimpleApplicationEventMulticaster
      this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
      beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
      if (logger.isTraceEnabled()) {
         logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
               "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
      }
   }
}

通过上面一段源码,我们就可以自定义实现ApplicationEventMulticaster接口,只需要向IOC容器中注册一个beanName="applicationEventMulticaster"实现ApplicationEventMulticaster接口的对象就可以覆盖默认事件发布规则了。

@Configuration
public class AsynchronousSpringEventsConfig {
    @Bean(name = "applicationEventMulticaster")
    public ApplicationEventMulticaster simpleApplicationEventMulticaster() {
        SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster();
        //设置任务执行器
        eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
        return eventMulticaster;
    }
}

上面的代码就实现了异步发布事件,这个是全局定义所有Spring 事件都会变成异步;

如果想要一部分事件是异步一部分是同步的就不满足要求了,接下来我们讲一下针对一个事件监听或事件实现异步支持。

异步事件@Async

结合@Async注解实现异步事件,使用很简单,只需要在相关方法或类上添加@Async注解,使用在方法上只针对这一个方法异步调用,使用在类上所有的方法都是异步调用;必须使用注解@EnableAsync开启异步功能

开启异步

@EnableAsync
@SpringBootApplication
public class SpringEventExampleApplication {

   public static void main(String[] args) {
      SpringApplication.run(SpringEventExampleApplication.class, args);
   }
}

异步监听事件

@Async
@EventListener
public void orderCreateEventAsync(OrderCreateEvent event) {
    System.out.println("订单创建事件,@EventListener 注解驱动实现");
}

泛型支持

也可以自定义泛型类实现事件调度。

让我们创建一个泛型事件类,没有继承任何父类或接口。

泛型事件类:

public class GenericEvent<T> {
    private final T data;
    public GenericEvent(T data) {
        this.data = data;
    }
    public T getData() {
        return data;
    }
}

泛型事件用注解驱动监听 @EventListener:

@EventListener
public void orderListener(GenericEvent<Order> event) {
    System.out.println("通用泛型事件监听,订单");
}

事件对象可以是任意对象,也可以不是泛型类型,比如我们直接发布一个Order监听一个Order

Order发布

applicationEventPublisher.publishEvent(order);

Order监听

@EventListener
public void order(Order order) {
    System.out.println("监听一个订单");
}

这样就不用专门创建一个事件对象,是不是更简单了。

事物事件@TransactionalEventListener

从Spring4.2开始提供了一个新的事件监听注解@TransactionalEventListener,它是@EventListener的扩展,允许将事件的监听绑定到事物的一个阶段。有以下四个阶段:

  • AFTER_COMMIT(默认值)事务成功提交时触发事件
  • AFTER_ROLLBACK - 事务回滚
  • AFTER_COMPLETION - 事务已完成(AFTER_COMMIT 或 AFTER_ROLLBACK)
  • BEFORE_COMMIT 在事务提交之前触发事件
@TransactionalEventListener(phase = BEFORE_COMMIT)
public void txEvent(Order order) {
    System.out.println("事物监听");
}

仅当存在事件生成器正在运行且即将提交的事务时,才会调用此侦听器。

并且,如果没有正在运行的事务,则根本不发送事件,除非我们通过将fallbackExecution 属性设置为true来覆盖它 ,即@TransactionalEventListener(fallbackExecution = true)。

新事件继续传播

当我们监听一个事件处理完成时,还需要发布另一个事件,一般我们想到的是调用ApplicationEventPublisher#publishEvent发布事件方法,但Spring提供了另一种更加灵活的新的事件继续传播机制,监听方法返回一个事件,也就是方法的返回值就是一个事件对象。

监听方法方法返回一个新的事件

@EventListener
public OrderCreateEvent orderReturnEvent(Order order) {
    System.out.println("监听一个订单,返回一个新的事件 OrderCreateEvent");
    return new OrderCreateEvent(this,order);
}

监听方法方法返回多个事件-集合

@EventListener
public Collection<OrderCreateEvent> orderReturnListEvent(Order order) {
	System.out.println("监听一个订单,返回集合的事件 OrderCreateEvent");
    return Collections.singleton(new OrderCreateEvent(this, order));
}

监听方法方法返回多个事件-数组

@EventListener
public Object[] orderReturnArrayEvent(Order order) {
    System.out.println("监听一个订单,返回数组的事件 OrderCreateEvent");
    return new OrderCreateEvent[]{new OrderCreateEvent(this, order), new OrderCreateEvent(this, order)};
}

注意返回集合事件时,集合内事件类型可以不同。

总结

本章节从观察者模式为入口点,分别以自定义、java API、Spring 事件介绍了他们对观察者模式的实现。

Spring事件各种发布和监听的方式,我们可以根据业务情况任意选择。

如果你的项目Spring版本低于4.2基于注解驱动方式则不适合,只能继承事件类或实现监听接口的方式。

本章节所有示例代码都在GitHub上获取或者直接用 git clone ,它一个Maven+Spring boot项目。

git clone https://github.com/ssp1523/spring-event-example.git
zabbix 监控EMC存储 经过搜索,找到了脚本地址,该项目应该是模板原作者创建的,该项目也有zabbix模板,和上面的应该是相同的,我用的是上面的模板。./unity_get_state.py --api_ip='X.X.X.X' --api_port='443' --api_user='zabbix' --api_password='PASSWORD' --storage_name="zabbix web前端配置的主机名" --discovery。修改权限,给zabbix用户执行权限,模板调用时以zabbix用户执行。 阅读详情

相关推荐

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(上)

本文深入解析了AM32电调固件的源码架构与核心模块实现。文章首先介绍了AM32电调作为开源无人机;动力心脏的重要地位,随后从硬件基础、源码目录、模块划分三个维度构建解析框架。重点剖析了系统初始化模块的时钟配置、GPIO初始化和定时器设置,以及FOC控制模块的坐标变换算法、角度估算和SVPWM生成等关键技术实现。通过逐行代码解析,揭示了电调如何将飞控指令转换为电机驱动的完整过程,为开发者理解AM32电调工作原理提供了系统性指导。

bother3000的博客 6560

SpringBoot事件监听机制及观察者模式/发布订阅模式

文章目录本篇要点什么是观察者模式?发布订阅模式是什么?Spring事件监听机制概述SpringBoot事件监听定义注册事件注解方式 @EventListener定义监听器实现ApplicationListener的方式定义监听器注册事件发布者定义接口主程序类测试接口源码下载参考阅读 本篇要点 介绍观察者模式和发布订阅模式的区别。 SpringBoot快速入门事件监听。 什么是观察者模式? 观察者模式是经典行为型设计模式之一。 在GoF的《设计模式》中,观察者模式的定义:在对象之间定义一个一对多的依赖,当

天乔巴夏丶 1922

Audio2Face进阶玩法:结合LiveLink在UE5中实现MetaHuman全身动画+语音驱动(保姆级配置指南)

本文提供了一份详尽的保姆级教程,指导如何将NVIDIA Audio2Face与Unreal Engine 5的LiveLink功能结合,实现驱动MetaHuman数字人面部表情的同时,无缝融合身体动画。文章详细讲解了从环境准备、插件部署、基础面部驱动测试,到动画蓝图高级配置与多数据流融合的全流程,并分享了性能优化与问题排查的实战经验,旨在帮助创作者打造表情与肢体动作协调统一的生动数字人。

q9w8e7r6t5的博客 196

SpringBoot事件监听机制及观察者/发布订阅模式详解

** * 注解方式 @EventListener * @author Summerday */ @Service @Slf4j public class CouponService { /** * 监听用户注册事件,执行发放优惠券逻辑 */ @EventListener public void addCoupon(UserRegisterEvent event) { log.info("给用户[{}]发放优惠券", event.getUsername());

m0_63437643的博客 443

CNN经典论文(一)LeNet

Gradient-Based Learning Applied to Document Recognition(梯度学习在文档识别中的应用) Yann LeCun, Leon Bottou, Yoshua Bengio, and Patrick Haffner 发表时间:December 1998 期刊:Proceedings of the IEEE 影响:世界上第一个卷积神经网络 论文地址:Gradient-Based Learning Applied to Document Recognition

loveling丶的博客 3597

Windows报错“The system cannot find the file specified“的PATH环境变量解决方案

摘要: Windows系统中出现"The system cannot find the file specified"错误通常因PATH环境变量配置问题导致。本文提供解决方案:1)检查并修正PATH变量(通过命令行或图形界面添加缺失路径);2)确认程序安装路径及拼写无误;3)恢复误改的系统变量。示例演示了Python路径配置及无效路径清理方法,建议谨慎修改变量、使用绝对路径并定期检查。附参考表格详述操作步骤,帮助用户高效解决问题并优化系统环境。

shejizuopin的博客 3516

第2章 Spring 订阅与发布的原理

目录注册事件广播器注册事件监听器加载事件监听器发布事件处理事件 在之前了解Spring的订阅与发布是如何使用以后,我们来看Spring是如何实现订阅与发布。Spring的订阅与发布主要分为四个模块: 注册事件广播器 ApplicationEventMulticaster 注册事件监听器 ApplicationEventListener 发布事件 处理监听事件 注册事件广播器 Spring在注册事件广播器时,会调用 AbstractApplicationContext#refresh 方法。这个方法是用来

Shiro框架02 740

红米K70至尊版修复“nv损坏”主板电阻图示 mtk芯片工程固件刷写与步骤说明

💝💝💝红米K70至尊版 机型代码:rothko,搭载天玑9300+旗舰芯片.后置5000万像素索尼IMX906高动态OIS主摄,800万像素超广角镜头,200万像素微距镜头,前置2000万像素摄像头,也适用于以下型号的小米机型:2407FPN8EG,2407FPN8ER,XIG06,A402XM,2407FRK8EC。 💝💝💝通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此机型刷写工程固件预览界面 3💝💝💝------红米K

小马哥的专栏 1458

详解Spring事件驱动模型

  事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型;理解它的几个关键点: 首先是一种对象间的一对多的关系;最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方); 当目标发送改变(发布),观察者(订阅者)就可以接收到改变; 观察者如何处理(如行人如何走,是快走/慢走/不走,目标不会管的),目标无需干涉;所以就松散耦合了它们之间的关系。  ...

jinnianshilongnian的专栏 704

cefshap(C#)定义浏览器的右键菜单

菜单效果:复制(自带),搜索文本,打开链接,复制链接,刷新,检查,关于 public class MenuHandler : IContextMenuHandler { //public event Action<string> PopupRequest; void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrows

无线智能模块 可视DIY智能专家 1705

2xmax96717+max96724+agx orin驱动代码

说明:这里主要解决max96717的设备地址和sensor地址映射,vc0->vc1多颗max96717+max96724使用配置思路如下: 1、改变max96717的pipez stream id,然后max96724的pipe绑定使用相应的stream id 2、max96717默认是vc0,把vc0改写成vc1\vc2\vc3,然后max96724再重新映射vc输出

mantouyouyou的博客 113

java设计模式之观察者模式

概述 观察者模式又称为发布/订阅(Publish/Subscribe)模式 观察者设计模式涉及到两种角色:主题(Subject)和观察者(Observer) Subject模块 Subjec模块有3个主要操作 addObserver():注册添加观察者(申请订阅) deleteObserver():删除观察者(取消订阅) notifyObserver():主题状态发生变化时通知所有的观察者对象 Observer模块 ...

有个疙叫瘩儿的博客 576

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring源码分析(观察者模式、策略者模式)

Spring源码分析 1、观察者设计模式 什么是观察者模式 观察者模式:定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖它的对象都得到**通知(响应)**并自动更新。 又称:发布/订阅、消息通知机制、事件监听机制、事件驱动编程。 package com.xuexiangban.service; public class OrderService { public void makeOrder() { // 1:创建订单 -- 主要的职责是:创建订单

qq_46611668的博客 494

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Spring】Spring相关

Spring事件驱动 一、什么是事件驱动(以下内容摘自:https://www.cnkirito.moe/event-1/) 说到事件驱动,我们可能会立刻联想到如此众多的概念:观察者模式、发布/订阅模式、消息队列MQ、消息驱动、事件、EventSourcing…;为了不产生歧义,笔者把自己所了解的这些模棱两可的概念都列了出来,再开始今天的分享: 观察者模式:在设计模式中,观察者模式可以算得上是一个非常经典的行为型设计模式,”猫叫了,主人醒了,老鼠跑了“这一经典的例子,是事件驱动模型在设计层面的体现 发布

lyy296293760的博客 691

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

大白话讲解Java观察者模式

观察者模式是23种设计模式之一,是一种行为型设计模式,言而言之就是创建好对象之后,用来定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。比如手机中的天气预报,当天气预报站(被观察者或者主题)预报的天气发生改变时,就会通知我们手机(观察者)中的天气发生变化。每当被观察者的状态发生变化时,它都会通知多有注册的观察者,然后这些观察者会根据自己的需要来响应这个变化,这就是观察者模式。你有一个微信群,你是群主(主题对象/被观察者)。

qq_36955155的博客 1284

SpringBoot项目实现发布订阅模式,真的很简单

}} }} }PlaceOrderEvent:继承ApplicationEvent,并重写构造函数。ApplicationEvent是Spring提供的所有应用程序事件扩展类。} }PlaceOrderEventMessage:事件消息,定义了事件的消息体。/*** 订单号/*** 订单状态/*** 下单用户ID//…… }异步执行也非常简单,使用Spring的异步注解@Async就可以了。} }

三分恶的博客 1415

SpringEvent 和 观察者模式(发布-订阅模式)

用途:可用于拦截过滤器。

m0_57801749的博客 606

SpringBoot Event,事件驱动轻松实现业务解耦

Spring Boot 结合Guava,Spring Event Driven实现事件驱动模式,轻松完成业务解耦。

大橘的博客 1886

用了SpringBoot的发布订阅模式,代码看着高级多了

Slf4j@Service@Override@Slf4j@Service@Override@Slf4j@Service@OverridePlaceOrderEvent:继承ApplicationEvent,并重写构造函数。ApplicationEvent是Spring提供的所有应用程序事件扩展类。PlaceOrderEventMessage:事件消息,定义了事件的消息体。@Data/*** 订单号*//*** 订单状态*//*** 下单用户ID*/

IT_1024的博客 424

Spring事件机制详解

Spring事件是一种基于Spring框架的事件驱动编程模型,它可以让开发者在应用程序中发布和监听事件。Spring事件的实现原理是基于观察者模式,也可以看作是一种发布订阅模式的变体。观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象的状态发生变化时,它会通知所有观察者对象,使它们能够自动更新自己。

qq_61887118的博客 754

Spring Event 事件驱动模型

Spring事件驱动模型,简单来说类似于Message-Queue消息队列中的Pub/Sub发布/订阅模式,也类似于Java设计模式中的观察者模式。 1. 创建一个通用泛型事件模型 @Data public class CommonSpringEvent<T> { private T data; protected boolean success; public CommonSpringEvent(T data, boolean success) { t

yanziyu0721730的博客 339

别再面向 for 循环编程了,Spring 自带的观察者模式就很香!

上一篇:JDK 自带的观察者模式就很香! 前段时间栈长给大家分享了什么是观察者模式,以及在 JDK 中如何实现观察者模式,现在都是 Spring 的天下了,今天就再分享下如何在 Spring/ Spring Boot 中实现观察者模式。 不用再面试 for 循环编程了,Spring 框架自带的事件监听机制,实现观察者模式、实现解耦轻松帮你全搞定! Spring 事件监听机制 其实在 Spring/ Spring Boot 框架中有一套事件监听机制,可以实现观察者模式。 Spring/ Spring Boot

Java技术栈,分享最主流的Java技术 1688

SpringBoot项目实现发布订阅模式

大家好,我是老三,在项目里,经常会有一些主线业务之外的其它业务,比如,下单之后,发送通知、监控埋点、记录日志…… 这些非核心业务,如果全部一梭子写下去,有两个问题,一个是业务耦合,一个是串行耗时。

Javatutouhouduan的博客 714

【设计模式手册002】观察者模式 - 对象间的优雅通信艺术

观察者模式:解耦对象通信的优雅方案 摘要:观察者模式是一种行为设计模式,用于建立对象间的一对多依赖关系。当主题对象状态改变时,它能自动通知所有注册的观察者对象。这种模式解决了传统强耦合通知机制的痛点(如违反开闭原则、难以维护等),通过定义Subject和Observer接口,实现了松耦合通信。模式支持推/拉两种数据传递方式,Java标准库也曾内置实现。在实战中,观察者模式常用于事件驱动架构,如订单系统中库存、物流等模块的自动更新通知,使系统更易于扩展和维护。

weixin_43160093的博客 996
上一篇: Java集合类—List学习笔记
下一篇: Spirng Cache(第一篇) 初体验
孙平平
博客等级 码龄10年 44粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值