【Spring】Spring之publishEvent

2023-11-10

观察者模式Spring之publishEvent事件处理

1.使用场景

这个一般什么时候使用,我们一般是在不同的bean直接进行信息传递,比如我们beanA的事件处理完后,需要beanB进行处理一些业务逻辑的时候这种情况就一般可以使用publish-event解决。

可用于操作日志记录

2.原理

ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口来提供的,通过ApplicationContext的publishEvent()方法发布到ApplicationListener;。

一个事件模型有三个组成部分:被监听对象source(也称为事件源),事件event和监听对象listener。事件发布者在发布事件的时候->通知事件的监听者。

首先,由监听对象注册监听回调函数(Callback),当事件源触发了事件后,监听对象会收到事件源的信息,然后决定如何对事件源进行处理,简要流程如下图所示。
在这里插入图片描述

3.事件触发 && 监听处理过程

(1) 使用 org.springframework.context 包下的 ApplicationContext.publishEvent(ApplicationEvent appEvent) 发布事件
(2) 使用 org.springframework.context.event 包下的 @EventListener(事件名) 监听事件并处理。

注意:
(1) ApplicationContext.publishEvent 默认是同步操作, 并非发布后不管的异步操作,发布事件后需要等 @EventListener 执行完。
(2) 如果需要开启异步操作需要在@EventListener上增加@Async 注解。

4.代码实现

(1)CustomEvent

/**
 * 用户事件监听
 *
 * @author zhang
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomEvent {
    private String message;
}

(2)CustomEventListener

/**
 * @author zhang
 */
@Component
public class CustomEventListener {

    @EventListener(CustomEvent.class)
    public void onApplicationEvent(CustomEvent customEvent) throws InterruptedException {
        System.out.println("监听器接受消息:"+ customEvent.getMessage());
    }
}

(3)CustomController

/**
 * @author zhang
 */
@RestController
public class CustomController {

    @Resource
    private ApplicationContext applicationContext;

    @RequestMapping("/helloListener")
    public String helloListener(){
        System.out.println("模拟执行某业务逻辑A!");
        System.out.println("=======AAA================");
        System.out.println("模拟执行某业务逻辑B-> 即A执行完成后执行业务逻辑B");
        System.out.println("事件开始发布消息!");
        applicationContext.publishEvent(new CustomEvent("你好啊"));
        System.out.println("=======BBB================");
        System.out.println("模拟执行某业务逻辑B执行完毕!");
        return "success";
    }
}

5.执行结果

在这里插入图片描述
在这里插入图片描述

https://blog.csdn.net/jike11231/article/details/124872298

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Spring】Spring之publishEvent 的相关文章

  • 简单 XML 框架:ElementMap 中的对象具有“类似内联”的行为

    我正在尝试在 Android 上序列化自定义对象的 Hashmap 以获得如下 xml
  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • 类型已知,但方法指的是缺失类型

    我对 java 和 Eclipse 不太有经验 但遇到以下问题 我正在写类似的东西 Point3D myPoint myClass myMethod arg 我收到错误 方法 myMethod myType arg 引用缺失的类型 Poin
  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • java 中的梵文 i18n

    我正在尝试使用来自互联网的示例 ttf 文件在 java 中使用 i18n 进行梵文 印地文 我可以加载资源包条目 还可以加载 ttf 并设置字体 但它不会根据需要呈现 jlabel 它显示块代替字符 如果我在 Eclipse 中调试 我可
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • 未注入带有 JPA2 的 Apache Ignite 2.7 IgniteRepository

    使用在 Web 上建立的 guildes 我使用 Spring Data JPA 2 应用程序制作了简单的 Spring Boot 2 仅在 2 7 版本中才向 Apache Ignite 添加了 Spring Boot JPA 2 支持
  • Spring 5.0.3 依赖问题

    升级到 spring 5 0 3 后我遇到以下问题 09 25 29 141 ERROR org jboss msc service fail ServerService Thread Pool 175 MSC000001 Failed t
  • 使用 Jena 查询维基数据

    目前 Wikidata 有一个 SPARQL 端点 https query wikidata org https query wikidata org 我想使用 Jena 3 0 1 查询此网站 我使用以下代码 但收到错误消息 端点返回的
  • for循环中更新JLabel的问题

    我的程序的想法是从之前在其他 JFrame 中保存的列表中选择一个名称 我想在标签中一个接一个地打印所有名称 它们之间有很小的延迟 然后停在其中一个名称上 问题是lbl setText String 如果有多个则不起作用setText co
  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • 如何在 Eclipse 中获得完全限定的类名?

    有没有一种快速方法可以在 Eclipse 中单击 Java 类并获取其完全限定名称 或将其复制到剪贴板 2016年6月29日编辑 正如 Jeff 所指出的 您只需要执行以下第二步 1 Double click on the class na
  • 从 CLI 部署 Maven 项目?

    在 IDE 中构建并运行良好 cd home thufir NetBeansProjects HelloMaven JAVA HOME usr lib jvm java 8 openjdk amd64 home thufir local s
  • 是否可以手动检查 LocateRegistry 是否存在?

    I 已经发现 https stackoverflow com a 8338852 897090一种安全的方式获得LocateRegistry 即使注册表尚不存在 Registry registry null try registry Loc
  • 接口是否像对象一样对待?

    为什么下面的代码可以工作 interface I class A implements I public String toString return in a class B extends A public String toStrin
  • Hibernate 标准接受 %% 值

    我正在使用下面的 Hibernate 代码来过滤workFlowName crt add Restrictions like workFlowName workFlow MatchMode ANYWHERE crt is the crite
  • 无法连接到docker中的elasticsearch容器

    我正在尝试使用 docker 的官方 elasticsearch 镜像 我遵循了本指南 https www elastic co guide en elasticsearch reference current docker html但是当
  • 开发者环境-如何调用/消费其他微服务

    背景 我的环境 Java Play2 MySql 我在 Play2 gt S1 S2 S3 上编写了 3 个无状态 Restful 微服务 S1 消耗来自 S2 和 S3 的数据 因此 当用户点击 S1 时 该服务会异步调用 S2 S3 合
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该

随机推荐

  • android 11 存储权限,Android 11存储权限强制申请

    private static final int REQUEST CODE 1024 private void requestPermission if Build VERSION SDK INT gt Build VERSION CODE
  • OC中的基本容器和基本数据类型

    基本数据类型 NSRange 是一个结构体 里面有两个数据成员数据类型都为NSUInteger 就是c语言中的无符号整形 一个是location表示集合的起始地址 另外一个变量是length表示从起始地址开始算多少个元素 NSRange的三
  • CTF-web 简介

    web部分是CTF的重要组成部分之一 素有WEB大魔王之称 题目种类繁多 关键是如何发现漏洞的类型和怎样构造特殊的负载绕过过滤 CTF分为三种模式 解题模式 攻防模式 混合模式 在线工具 https www ctftools com dow
  • JVM运行时数据区

    文章目录 JVM内存结构图 1 运行时数据区域 JDK 1 7 JDK 1 8 1 线程栈 虚拟机栈 2 本地方法栈 3 程序计数器 4 方法区 元空间 5 堆 6 运行时常量池 Runtime Constant Pool 7 直接内存 D
  • 新版MetaMask如何获取当前账户地址

    window addEventListener load async gt Modern dapp browsers if window ethereum let ethereum window ethereum window web3 n
  • C语言中 -> 和 . 的区别

    在C语言中 gt 和 都是用于访问结构体 struct 成员的运算符 但它们的使用场景略有不同 1 gt 运算符用于访问结构体指针的成员 当你有一个指向结构体的指针时 你可以使用 gt 运算符来访问该结构体的成员 例如 struct Per
  • Linux使用第三方库链接的使用方式——静态式

    目录 二 第三方库为静态库时 方法1 两个窗口去分别模拟两个窗口公司A 客户端 公司B 服务端 的视角案例实现 提前插播一条指令 生成静态库文件的指令 方法2 优化 该方法在上述方法1的第10步后开始进行 这里强调一个问题 今天我们来学习将
  • 记录一个AFR去嵌S参数异常的案例。

    最近在使用AFR去嵌一个S参数的时候 遇到了如下问题 首先介绍一下这个S参数 一端是MCIO连接器 另一端是CEM连接器 所以测试的时候一端接MCIO测试治具 一端接CEM测试治具 再通过线缆将测试治具连接到VNA上 我大概画了一个简图如下
  • Java 输出机制 数据类型 基本数据类型转换 基本数据类型和String类型的转换

    目录 一 输出机制 1 print和println的差别 2 可接收不同类型参数 3 输出函数中 符号的使用 二 数据类型 1 整型类型 2 浮点类型 3 字符类型 三 基本数据类型转换 1 自动类型转换 2 强制类型转换 3 练习题 四
  • 目标检测算法回顾之发展概览

    目标检测算法的发展时间线 发展历史轴 时间轴线图 算法方法概览 思维导图 说明 本文仅供学习 发展历史轴 时间轴线图 目标检测的算法发展可以追溯到很久之前 这里我根据前两年的综述论文加上这两年的发展也画了两个部分的相关模型发展轴 可以看到
  • linux命令之ssh详解

    ssh openssh套件中的客户端连接工具 Linux在线工具 linux命令在线工具 个人博客网站 博客 Java17中文文档 JDK17中文手册 Gradle8 1 1中文文档 Gradle中文文档 补充说明 ssh命令 是opens
  • (转载)Linux 系统内核的调试

    调试是软件开发过程中一个必不可少的环节 在 Linux 内核开发的过程中也不可避免地会面对如何调试内核的问题 但是 Linux 系统的开发者出于保证内核代码正确性的考虑 不愿意在 Linux 内核源代码树中加入一个调试器 他们认为内核中的调
  • PHP实现微信小程序状态检测(违规、暂停服务、维护中、正在修复)

    实现原理 进入那些状态不正常的小程序会被重定向至一个Url 使用抓包软件抓取这个Url 剔除不必要参数 使用cURl函数请求网页获得HTML内容 根据内容解析出当前APPID的小程序的状态 代码
  • thrust库学习(一) —— cub::DeviceRadixSort

    1 cub DeviceRadixSort 1 1 介绍 DeviceRadixSort提供设备范围内的并行操作 用于跨驻留在设备可访问内存中的数据项序列计算基数排序 基数排序方法按升序 或降序 排列项目 该算法依赖于键的位置表示 即每个键
  • LeetCode-动态规划-路径的数目

    1 题目 剑指 Offer II 098 路径的数目 62 不同路径 2 实现 class Solution public vector
  • 原生js方法小记

    ps 无框架时 使用js的一些功能完成一些小demo 记录方法 方便自己查询 原生js方法小记 String 和Array 方法 替换所有 追加replaceAll方法 String prototype replaceAll functio
  • spring提供的登录j_spring_security_check

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 第一步 form表单提交
  • 芯片中的上百亿个晶体管是如何设计的?

    2021年4月21日 在芯片界的顶级会议Hot Chips大会上 Cerebras Systems公司发布了一款晶圆级引擎芯片 Wafer Scale Engine 2 这款芯片采用台积电7纳米工艺制程 拥有85万个AI核心 包含2 6万亿
  • 如何在html中把按钮设置为超链接

    如何给按钮加上链接功能 脚本说明 把如下代码加入区域中
  • 【Spring】Spring之publishEvent

    观察者模式Spring之publishEvent事件处理 1 使用场景 这个一般什么时候使用 我们一般是在不同的bean直接进行信息传递 比如我们beanA的事件处理完后 需要beanB进行处理一些业务逻辑的时候这种情况就一般可以使用pub