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的事件监听和发布机制,我们可以轻松地构建出更加模块化和可维护的应用,因为我们可以在不修改监听器代码的情况下添加新的事件源,或者在不修改事件源代码的情况下添加新的监听器。这种解耦的方式使得应用更加灵活和可扩展。
java springboot监听事件和处理事件的更多相关文章
- [置顶] java Gui 键盘监听事件
简单写一个java Gui键盘监听事件,实现的效果就是按下键盘控制台输出你按下的键.比如:按下A控制台就输出A 效果如图: 以下把实现的效果分为几个步骤: 1.新建一个窗体类继承窗体: 2.给这个窗体 ...
- JAVA JComboBox的监听事件(ActionListener、ItemListener)
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 参考资料: http://263229365.iteye.com/blog/1040329 https://www.ja ...
- java中的监听事件
java监听器实现的类 1.ServletContextListener:对servlet上下文的创建和销毁监听 2.ServletContextAttributeListener:监听servlet ...
- 横向滑动的listview和其中用到的触摸监听事件详解
一.首先把横向的listview的代码放上来 HorizontalListView: package com.common.cklibrary.utils.myview; import java.ut ...
- springboot13 发布和监听事件
spring中的事件驱动模型Event(也叫发布订阅模式),是观察者模式的一个典型的应用 好处:业务解耦,在不影响原来业务逻辑的情况下,加入其它业务 场景: app上线后已实现用户注册功能,现需要在用 ...
- spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情
<spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...
- zookeeper 监听事件 PathChildrenCacheListener
zookeeper 监听事件 PathChildrenCacheListener PathChildrenCacheListener一次父节点注册,监听每次子节点操作,不监听自身和查询. 1.测试类: ...
- zookeeper 监听事件 NodeCacheListener
zookeeper 监听事件 NodeCacheListener NodeCacheListener一次注册,每次监听,但是监听不到操作类型,不知道是增加?删除?还是修改? 1.测试类: packag ...
- zookeeper 监听事件 CuratorWatcher
zookeeper 监听事件 CuratorWatcher CuratorWatcher一次注册只监听一次,不监听查询. 1.监听测试类 package com.qy.learn.zk.curator ...
- Second Day: 关于Button监听事件的三种方法(匿名类、外部类、继承接口)
第一种:通过匿名类实现对Button事件的监听 首先在XML文件中拖入一个Button按钮,并设好ID,其次在主文件.java中进行控件初始化(Private声明),随后通过SetOnClickLis ...
随机推荐
- OpenAirInterface,开源的 4G EPS 实现
目录 文章目录 目录 前文列表 OSA OpenAirInterface OAI 的仿真 物理信道仿真 系统级仿真 OAI 的 SDR LTE 参考文档 前文列表 <USRP B210 软件定义 ...
- 因为我的一次疏忽而带来的golang1.23新特性
距离golang 1.23发布还有两个月不到,按照惯例很快要进入1.23的功能冻结期了.在冻结期间不会再添加新功能,已经添加的功能不出大的意外一般也不会被移除.这正好可以让我们提前尝鲜这些即将到来的新 ...
- linux ls命令的重要用法:按照文件大小排序和按照时间排序
1.ls命令是list的缩写,用来打印当前目录清单或者打印出指定目录下的文件及文件清单. 2.本文介绍ls的重要用法:按"文件大小"排序列出文件清单和按"时间" ...
- 源码分析——MyBatis核心接口SqlSession的实现原理
在上一篇文章中(<MyBatis动态代理调用过程源码分析>),我们知道了MyBatis动态代理的核心是MapperProxy,在它内部封装了动态代理的调用逻辑,而我们也知道了在使用动态代理 ...
- tkinter的Text组件设置禁止编辑
完整代码: from tkinter import * import requests window = Tk() window.geometry('1000x500+300+100') window ...
- 使用itextPDF实现PDF电子公章工具类
使用itextPDF实现PDF电子公章工具类 一.制作公章 在线网站:印章生成器 - Kalvin在线工具 (kalvinbg.cn) 然后对公章进行下载保存 盖章图片: 二.生成数字签名 2.1: ...
- 在.NET Core,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)
Like运算符很好用,特别是它所提供的其中*.?这两种通配符,在Windows文件系统和各类项目中运用非常广泛. 但Like运算符仅在VB中支持,在C#中,如何实现呢? 以下是关于LikeString ...
- Javascript高级程序设计第五章 | ch5 | 阅读笔记
基本引用类型 Date 在不给定时间的情况下创建Date实例,创建的对象将保存当前的日期和时间. 要基于其他时间创建Date对象,必须传入其毫秒时表示 Date.parse() 月/日/年(5/21/ ...
- [TinyRenderer] Chapter1 p3 Line
(注:本小节不是对划线算法事无巨细的证明,如果你需要更加系统的学习,请跳转至文末的参考部分) 如果你是一名曾经学习过图形学基础的学生,那么你一定对画线算法稔熟于心,中点划线算法,Bresenham算法 ...
- markdown折叠展开代码
背景 有的时候,我们的代码太多,直接用cout<<"hello";很不方便. 我们可以将代码折叠. 效果 代码 普通代码折叠 <details> <s ...