spring @EventListener 事件与监听的示例详解

2025-03-05 17:50

本文主要是介绍spring @EventListener 事件与监听的示例详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序...

1、自定义Application Event

package com.ybw.event.pojo;
import lombok.Getter;
import lombok.Setter;
import org.springframework.context.ApplicationEvent;
/**
 * @className MyEvent
 * @author weixiansheng
 * China编程@date 2023/9/28 China编程
 * @version V1.0
 **/
@Setter
@Getter
public class MyEvent extends ApplicationEvent {
    private String data;
    public MyEvent(Object source, String data) {
        super(source);
        this.data = data;
    }
}

2、自定义监听

package com.ybw.event.listener;
import com.ybw.event.pojo.MyEvent;
import lombok.extern.slf4j.Slf4j;
import orgfEaxY.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
 * 简单监听
 *
 * @author weixiansheng
 * @version V1.0
 * @className MySimpleListener
 * @date 2023/9/28
 **/
@Component
@Slf4j
public class MySimpleListener {
    /**
     * @param event
     * @methodName: handleDemoEvent
     * @return: void
     * @author: weixiansheng
     * @date: 2023/9/28
     **/
    @EventListener
    public void handleDemoEvent(MyEvent event) {
        log.info("发布的data为:{}", event.getData());
    }
}

3、测试

package com.ybw.event.listener;
import com.ybw.event.pojo.MyEvent;
import com.ybw.util.SpringContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import Java.util.concurrent.TimeUnit;
/**
 * @author weixiansheng
 * @versiojavascriptn V1.0
 * @className MySimpleListenerTest
 * @date 2023/9/28
 **/
@SpringBootTest
@Slf4j
class MySimpleListenerTest {
    /**
     * 发布消息
     *
     * @methodName: publishEvent
     * @return: void
     * @author: weixiansheng
     * @date: 2023/9/28
     **/
    @Test
    public void publishEvent() throws InterruptedException {
        log.info("publishEvent start");
        SpringContextHolder.pjavascriptublishEvent(new MyEvent(this, "测试"));
        log.info("publishEvent end");
        TimeUnit.DAYS.sleep(1);
    }
}

打印日志

[INFO ] 2023-09-28 10:19:15.312 [main] c.y.e.listener.MySimpleListenerTest - publishEvent start
[INFO ] 2023-09-28 10:19:16.344 [main] c.y.event.listener.MySimpleListener - 发布的data为:测试
[INFO ] 2023-09-28 10:19:16.347 [main] c.y.e.listener.MySimpleListenerTest - publishEvent end

4、源代码

share: 分享仓库 - Gitee.com

5、其他

5.1 顺序执行

使用注解

  • @Order order的值越小,优先级越高。
  • order如果不标注数字,默认最低优先级,因为其默认值是int最大值。

示例

/**
 * 普通监听
 *
 * @param event
 * @methodName: handleDemoEvent
 * @return: void
 * @author: weixiansheng
 * @date: 2023/9/28
 **/
@EventListener
@Order(2)
public void handleEvent(MyEvent event) throws InterruptedException {
    TimeUnit.SECONDS.sleep(1);
    log.info("handleEvent data:{}", event.getData());
}
/**
 * 条件监听
 *
 * @param event
 * @methodName: handleConditionEvent
 * @return: void
 * @author: weixiansheng
 * @date: 2023/9/28
 **/
@EventListener(condition = "#event.data=='张三'")
@Order(1)
public void handleConditionEvent(MyEvent event) {
    log.info("handleConditionEvent data:{}", event.getData());
}

打印日志

[INFO ] 2023-09-28 10:40:22.206 [main] c.y.event.listener.MySimpleListener - handleConditionEvent data:张三
[INFO ] 2023-09-28 10:40:23.216 [main] c.y.event.listener.MySimpleListener - handleEvent data:张三

 5.2 异步支持

        Spring 事件机制默认是同步阻塞的,如果 ApplicationEventPublisher 发布事件之后他会一直阻塞等待listener 响应,多个 listener 的情况下前面的没有执行完后面的会一直被阻塞。发布者和订阅者属于同一事务,如果订阅者执行失败了,发布者事务会回滚。

        可以利用 Spring 提供的线程池注解 @Async 来实现异步线程。异步不影响发布者的事务。

示例

/**
 * 普通监听
 *
 * @param event
 * @methodName: handleDemoEvent
 * @return: void
 * @author: weixiansheng
 * @date: 2023/9/28
 **/
@EventListener
public void handleEvent(MyEvent event) throws InterruptedException {
    TimeUnit.SECONDS.sleep(1);
    log.info("handleEvent data:{}", event.getData());
}
/**
 * 条件监听
 *
 * @param event
 * @methodName: handleConditionEvent
 * @return: void
 * @author: weixiansheng
 * @date: 2023/9/28
 **/
@Async
@EventListener(condition = "#event.data=='张三'")
public void handleConditionEvent(MyEvent event) {
    log.info("handleConditionEvent data:{}", event.getData());
}

打印日志

[INFO ] 2023-09-28 10:49:40.246 [thread-pool-1] com.ybw.event.listener.MyListener - handleConditionEvent data:张三
[INFO ] 2023-09-28 10:49:41.255 [main] com.ybw.event.listener.MyListener - handleEvent data:张三

一个是线程thread-pool-1,一个是线程main。 

6、总结

  • 事件模式概念
    • 事件:事件的触发者,比如用户注册就是事件。
    • 事件发布:描述发生了什么事情的对象,比如张三注册成功的事件。
    • 事件监听:监听到事件发生的时候,做一些处理,比如下单后,增加用户积分。
  • Spring中事件监听器的处理是同步方式
    • 日志都是都一个线程。
    • 执行时顺序的,执行完监听器的业务后,会向下继续执行后面的逻辑。如上例:publishEvent end。

到此这篇关于spring @EventListener 事件与监听的文章就介绍到这了,更多相关spring @EventListener 事件与监听内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于spring @EventListener 事件与监听的示例详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153648

相关文章

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自