java springboot监听事件和处理事件

在Spring Boot中,监听和处理事件是一种常用的模式,用于在应用程序的不同部分之间传递信息。Spring 的事件发布/订阅模型允许我们创建自定义事件,并在这些事件发生时由注册的监听器进行处理。这里,我将提供一个简单的Spring Boot应用程序示例,其中将包括事件的定义、事件的发布以及事件的监听。

1. Spring Boot应用程序示例

1.1 步骤 1: 创建Spring Boot项目

首先,我们可以使用Spring Initializr(https://start.spring.io/)来快速生成一个新的Spring Boot项目。在项目中添加Spring Web依赖,因为我们将使用一个简单的REST API来触发事件发布。

1.2 步骤 2: 定义事件

首先,我们定义一个简单的事件类。这个类将作为事件对象在应用程序中传递。

import org.springframework.context.ApplicationEvent;  public class CustomEvent extends ApplicationEvent {  private final String message;  public CustomEvent(Object source, String message) {  super(source);  this.message = message;  }  public String getMessage() {  return message;  }  
}

1.3 步骤 3: 创建事件监听器

然后,我们定义一个监听器来监听上面定义的事件。

import org.springframework.context.event.EventListener;  
import org.springframework.stereotype.Component;  @Component  
public class CustomEventListener {  @EventListener  public void handleCustomEvent(CustomEvent event) {  System.out.println("Received custom event - " + event.getMessage());  // 在这里可以执行更多操作,比如发送邮件、更新数据库等  }  
}

1.4 步骤 4: 发布事件

现在,我们需要一个方式来发布事件。通常,这会在业务逻辑代码中完成,但为了简单起见,我们将通过REST API来触发事件的发布。

首先,在我们的Spring Boot应用中添加一个控制器。

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.ApplicationEventPublisher;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.bind.annotation.RestController;  @RestController  
public class EventController {  @Autowired  private ApplicationEventPublisher eventPublisher;  @PostMapping("/publish")  public String publishEvent(@RequestParam String message) {  CustomEvent customEvent = new CustomEvent(this, message);  eventPublisher.publishEvent(customEvent);  return "Event published with message: " + message;  }  
}

1.5 步骤 5: 运行我们的Spring Boot应用

现在,我们可以运行我们的Spring Boot应用。一旦应用启动,我们可以使用Postman或curl命令来触发事件发布。

bash复制代码
​
curl -X POST http://localhost:8080/publish?message=Hello%20Spring%20Events

我们将在控制台看到输出,表明CustomEventListener已经接收并处理了事件。

1.6 总结

以上就是在Spring Boot中监听和处理自定义事件的一个完整示例。通过定义事件、创建监听器并发布事件,我们可以在不同的组件或服务之间轻松地传递信息。这种模式在微服务架构中尤其有用,因为它支持松耦合的通信方式。

2. 更详细的Spring Boot代码示例

当然,我会给出一个更详细的Spring Boot代码示例,该示例包含了完整的项目结构、配置以及必要的类来展示如何定义事件、监听事件以及通过REST API发布事件。

2.1 项目结构

假设我们的项目结构如下:

src/  
|-- main/  
|   |-- java/  
|   |   |-- com/  
|   |   |   |-- example/  
|   |   |       |-- demo/  
|   |   |           |-- DemoApplication.java  
|   |   |           |-- CustomEvent.java  
|   |   |           |-- CustomEventListener.java  
|   |   |           |-- EventController.java  
|   |-- resources/  
|       |-- application.properties  
|  
|-- pom.xml

2.2 pom.xml

首先,确保我们的pom.xml文件中包含了Spring Boot的起步依赖(starter)和Spring Web依赖:

<dependencies>  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <!-- Optional, but recommended -->  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-test</artifactId>  <scope>test</scope>  </dependency>  
</dependencies>  <properties>  <java.version>11</java.version>  <spring-boot.version>2.5.4</spring-boot.version>  
</properties>  <parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>${spring-boot.version}</version>  
</parent>

2.3 DemoApplication.java

这是Spring Boot的主应用类:

package com.example.demo;  import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  @SpringBootApplication  
public class DemoApplication {  public static void main(String[] args) {  SpringApplication.run(DemoApplication.class, args);  }  
}

2.4 CustomEvent.java

这是自定义事件类:

package com.example.demo;  import org.springframework.context.ApplicationEvent;  public class CustomEvent extends ApplicationEvent {  private final String message;  public CustomEvent(Object source, String message) {  super(source);  this.message = message;  }  public String getMessage() {  return message;  }  
}

2.5 CustomEventListener.java

这是事件监听器类:

package com.example.demo;  import org.springframework.context.event.EventListener;  
import org.springframework.stereotype.Component;  @Component  
public class CustomEventListener {  @EventListener  public void handleCustomEvent(CustomEvent event) {  System.out.println("Received custom event - " + event.getMessage());  // 在这里可以执行更多操作,比如发送邮件、更新数据库等  }  
}

2.6 EventController.java

这是REST控制器类,用于发布事件:

package com.example.demo;  import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.ApplicationEventPublisher;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.bind.annotation.RestController;  @RestController  
public class EventController {  @Autowired  private ApplicationEventPublisher eventPublisher;  @PostMapping("/publish")  public String publishEvent(@RequestParam String message) {  CustomEvent customEvent = new CustomEvent(this, message);  eventPublisher.publishEvent(customEvent);  return "Event published with message: " + message;  }  
}

2.7 application.properties

这是一个空的application.properties文件,但我们可以在这里添加任何Spring Boot配置。

2.8 运行和测试

(1)运行DemoApplication.java来启动Spring Boot应用。

(2)使用Postman或curl命令向http://localhost:8080/publish?message=Hello%20Spring%20Events发送POST请求。

(3)查看控制台输出,当我们向/publish端点发送POST请求时,Spring Boot应用会捕获到这个请求,并通过EventController中的publishEvent方法发布一个CustomEvent。这个事件随后被CustomEventListener捕获并处理,我们会在控制台上看到类似这样的输出:

复制代码
​
Received custom event - Hello Spring Events

这表明我们的事件监听器成功接收到了事件,并执行了相应的逻辑(在这个例子中是打印了一条消息)。

2.9 完整测试

为了完整地测试这个功能,我们可以使用Postman或者curl命令行工具来发送HTTP POST请求。以下是使用curl命令的示例:

bash复制代码
​
curl -X POST http://localhost:8080/publish?message=Hello%20Spring%20Events

我们应该会收到一个响应,内容是:

复制代码
​
Event published with message: Hello Spring Events

同时,我们的Spring Boot应用的控制台上也会显示事件被接收的消息。

2.10 总结

这个示例展示了如何在Spring Boot应用中定义自定义事件、发布事件以及监听事件。这是Spring事件驱动编程模型的一个简单应用,它允许我们以解耦的方式在应用的不同部分之间传递信息。在这个例子中,我们创建了一个简单的REST API来触发事件的发布,但这只是事件发布方式的一种。在更复杂的应用中,事件可能由多种不同的源触发,包括其他REST API调用、数据库更新、定时任务等。

通过利用Spring的事件监听和发布机制,我们可以轻松地构建出更加模块化和可维护的应用,因为我们可以在不修改监听器代码的情况下添加新的事件源,或者在不修改事件源代码的情况下添加新的监听器。这种解耦的方式使得应用更加灵活和可扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Mac上一键安装Mysql(解决所有安装问题)

重点强调安装mysql成功的关键在于安装的版本不能是最新&#xff01;&#xff01; 目录 一&#xff1a;下载mysql数据库安装部分到此结束 二&#xff1a;配置mysql数据库三&#xff1a;启动mysql数据库四&#xff1a;各类奇葩问题总结 一&#xff1a;下载mysql数据库 1.进入MyS…

214.贪心算法:K次取反后最大化的数组和(力扣)

class Solution { public:int largestSumAfterKNegations(vector<int>& nums, int k) {int sum 0;// 进行k次取反操作while (k > 0){// 对数组进行排序sort(nums.begin(), nums.end());// 将最小的元素取反nums[0] -nums[0];// 减少k的值k--;}// 计算数组的总和…

代码随想录算法训练营:27/60

非科班学习算法day27 | LeetCode455:分发饼干 &#xff0c;Leetcode376:摆动序列 &#xff0c;Leetcode53:最大子数组和 介绍 包含LC的两道题目&#xff0c;还有相应概念的补充。 相关图解和更多版本&#xff1a; 代码随想录 (programmercarl.com)https://programmercarl.c…

【触想智能】工业一体机在工程机械车辆上的应用分析

随着工程机械行业的不断发展和自动化程度的提高&#xff0c;工业一体机在工程机械车辆上的应用越来越广泛。工业一体机是集电脑、显示器、触摸屏、通讯、测量、控制等多种功能于一体的高度集成化的工业控制系统&#xff0c;在工程机械车辆上的应用可以为用户提供更为便捷、高效…

CVE-2024-36991:Splunk Enterprise任意文件读取漏洞复现 [附POC]

文章目录 CVE-2024-36991:Splunk Enterprise任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议CVE-2024-36991:Splunk Enterprise任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:…

Java并发/多线程CompleteableFuture详解

目录 CompleteableFuture 创建 获得结果的方法 辅助方法 allOf和anyOf的区别 CompletableFuture 里大约有五十种方法&#xff0c;但是可以进行归类: 变换类 thenApply 消费类 thenAccept 执行操作类 thenRun thenApply/thenAccept/thenRun 结合转化类 thenCombine 结…

OpenCV简单图像处理(仿射变换、单应性变换、图像特征提取、特征匹配)----20240709

一、仿射变换 几何变换是指对对图像的位置、大小、形状、投影进行变换,是将图像从原始平面投影到新的视平面。仿射变换(Affine)的特点是原始图像中的平行关系和线段长度比例关系保持不变。 仿射变换矩阵中有 6 个未知参数,cv2.getAffineTransform() 根据图像中不共线的 3 个…

如何成功的设计BGA?

目前&#xff0c;用于容纳各种先进多功能半导体器件&#xff08;如 FPGA 和微处理器&#xff09;的标准封装是球栅阵列 &#xff08;BGA&#xff09;。BGA 封装中的组件用于各种嵌入式设计中&#xff0c;既可用作主机处理器&#xff0c;也可用作存储器等外设。多年来&#xff0…

硅纪元小课堂 | 重燃回忆!手把手教你用AI免费让老照片“活”起来!

在这个数字化的时代&#xff0c;我们的照片承载了无数珍贵的回忆。然而&#xff0c;随着时间的流逝&#xff0c;这些照片可能会褪色、损坏&#xff0c;甚至丢失。但现在&#xff0c;有了AI技术的加持&#xff0c;我们可以让这些老照片重新焕发生机&#xff0c;甚至让它们“活”…

图论·Day01

P3371 P4779 P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; 注意的点&#xff1a; 边有重复&#xff0c;选择最小边&#xff01;对于SPFA算法容易出现重大BUG&#xff0c;没有负权值的边时不要使用&#xff01;&#xff01;&#xff01; 70分代码 朴素板dijsk…

《人生苦短,我用python·八》多线程和线程池的使用

在Python中&#xff0c;多线程是一种并发编程技术&#xff0c;它允许多个线程在程序中并行执行。这对于IO密集型任务&#xff08;如网络请求、文件读写等&#xff09;非常有用&#xff0c;因为这些任务在等待外部资源时可以让其他线程继续工作&#xff0c;从而提高程序的效率。…

openssl交叉编译-移植ARM

OpenSSL是一个开源的密码学工具包&#xff0c;提供了一组用于网络安全的加密和解密算法、协议以及相关工具的库&#xff0c;它通过提供多种加密算法、协议和工具&#xff0c;为网络通信和数据存储提供了强大的安全保障。 主要功能 加密和解密&#xff1a; OpenSSL提供了多种对…

CDGA|数据治理:构建高质量数据要素供给体系的核心在于畅通流通渠道

随着数字化时代的到来&#xff0c;数据已经成为驱动经济社会发展的核心要素。数据治理作为确保数据质量、保障数据安全、促进数据价值实现的重要手段&#xff0c;其重要性日益凸显。在数据治理的众多环节中&#xff0c;构建高质量数据要素供给体系尤为关键&#xff0c;而该体系…

Kafka发送对象消息

在配置中添加json序列化器 spring:application:name: spring-boot-kafka-basekafka:bootstrap-servers: 192.168.225.128:9092# 配置生产者序列化producer:value-serializer: org.springframework.kafka.support.serializer.JsonSerializer# 配置默认的topictemplate:default-…

C基础day6

1、思维导图 2、 #include<myhead.h> #define MAX 10 int main(int argc, const char *argv[]) {//定义一个数组&#xff0c;用于存储班级所有成员的成绩int score[MAX] {0};//完成对成员成绩的输入for(int i0;i<MAX;i){//任意一个元素score[i]printf("请输入第…

QGC与无人机之间的通信协议MAVLink,如何实现数据的收发和处理。

QGroundControl (QGC) 和无人机之间的通信主要依赖于 MAVLink 协议。MAVLink&#xff08;Micro Air Vehicle Link&#xff09;是一个轻量级、高效的通信协议&#xff0c;广泛应用于无人机和地面控制站之间的数据传输。以下详细讲解 QGC 与无人机之间的通信协议 MAVLink&#xf…

MySQL中undo log、redo log 和 binlog三种日志的作用及应用场景

在 MySQL 数据库中&#xff0c;undo log、redo log 和 binlog 都是关键的日志类型&#xff0c;它们在数据恢复和事务管理中起着重要作用。 Undo Log&#xff08;回滚日志&#xff09; 作用&#xff1a;undo log 主要用于事务回滚和MVCC&#xff08;多版本并发控制&#xff09;。…

springboot学生成绩管理系统-计算机毕业设计源码49296

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

【Web前端】CORS概述

1、基本概念 CORS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨源资源共享&#xff09;是一种基于HTTP的安全特性&#xff0c;它允许网页从一个域请求来自不同源服务器上的指定资源。这是一种安全功能&#xff0c;用于防止恶意网站读取另一个网站的数据。同源策略…

假期笔记1:anaconda的安装与pycharm中的引用

1.下载安装 Download Anaconda Distribution | Anaconda 2.填个邮箱 11111.. 3.下载。有点需要时间 4.安装&#xff0c;双击&#xff0c;根据实际进行&#xff0c;记清安装路径 5。环境设置 conda -V 6.创建环境 conda create --name env_name conda create --na…