前言

关于@EventListener注解,百度了一下,网上的教程很多都是继承这个,实现那个的,其实根本用不着这么麻烦,所以就写了此文,如文章所讲有误,还请谅解

更多详细用法请百度一下~

作用

关于事件监听,目前我的用法最多的就是记录日志之类的。

在此之前我们记录日志一般都是先把日志的service注入进来,然后调用,其实我们可以写的更优雅一点,那就是用@EventListener

开始

建一个实体类

package cn.daenx.myadmin.system.vo;
import lombok.Data; @Data
public class TestEventVo {
private String title;
private String content;
}

建一个处理方法

我一般在impl里

    @EventListener(classes = TestEventVo.class) //这个参数可以省略
public void handle1(TestEventVo testEventVo) {
log.info("进入handle1");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("title为{}", testEventVo.getTitle());
log.info("结束handle1");
}

建一个接口

    @GetMapping("/event")
public Result event() {
log.info("接收到前端请求");
TestEventVo testEventVo = new TestEventVo();
testEventVo.setTitle("我是标题");
//获取上下文,这里用的是Hutool里的工具类
SpringUtil.getApplicationContext().publishEvent(testEventVo);
log.info("即将响应给前端");
return Result.ok();
}

结果

调用一下这个接口



可以看到,我们的处理方法被正确执行了

结论

1.每个事件以实体类区分,在你的处理方法上添加注解@EventListener,方法的参数就是你用的实体类

2.处理方法执行完后,才会返回给前端,说明是同步处理

注意,处理方法只能有这实体类一个参数,如果有多个参数的话,项目会起不来

扩展

异步处理

可以通过在处理方法上添加注解@Async实现异步处理

    @Async
@EventListener(classes = TestEventVo.class)
public void handle1(TestEventVo testEventVo) {
log.info("进入handle1");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("title为{}", testEventVo.getTitle());
log.info("结束handle1");
}

多个处理方法时?

    @EventListener(classes = TestEventVo.class)//参数可以省略
public void handle1(TestEventVo testEventVo) {
log.info("进入handle1");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("title为{}", testEventVo.getTitle());
log.info("结束handle1");
} @EventListener
public void handle2(TestEventVo testEventVo) {
log.info("进入handle2");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("title为{}", testEventVo.getTitle());
log.info("结束handle2");
}

结果



通过观察日志时间,可以看到,

1.一个实体类有多个处理方法时,都会被执行

2.多个处理方法是单线程执行的,一个执行完了,另一个才会开始执行

3.所有处理方法都执行完后,才会返回给前端

springboot 事件监听@EventListener注解用法的更多相关文章

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

    目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...

  2. SpringBoot事件监听机制源码分析(上) SpringBoot源码(九)

    SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringApplicat ...

  3. 分享一下事件监听addEventListener----attachEvent的用法

    来自:http://www.cnblogs.com/wkylin/archive/2011/10/09/2203161.html 事件监听addEventListener----attachEvent ...

  4. SpringBoot事件监听

    代码演示: package com.boot.event.eventdemo; import org.springframework.boot.SpringApplication; import or ...

  5. (12)JavaScript之[事件][事件监听]

    事件 /** * 事件: * onload 和 onunload 事件在用户进入或离开页面时被触发 * * onchange事件常结合对输入字段的验证来使用 * onmouseover 和 onmou ...

  6. springBoot高级:自动配置分析,事件监听,启动流程分析,监控,部署

    知识点梳理 课堂讲义 02-SpringBoot自动配置-@Conditional使用 Condition是Spring4.0后引入的条件化配置接口,通过实现Condition接口可以完成有条件的加载 ...

  7. springboot 中事件监听模型的一种实现

    目录 定义事件本身 定义事件源 定义监听者 一.需要实现 ApplicationListener 二.使用 @EventListener 注解 测试 项目结构 前言: 事件监听模型是一种常用的设计模式 ...

  8. SpringBoot框架(6)--事件监听

    一.场景:类与类之间的消息通信,例如创建一个对象前后做拦截,日志等等相应的事件处理. 二.事件监听步骤 (1)自定义事件继承ApplicationEvent抽象类 (2)自定义事件监听器,一般实现Ap ...

  9. SpringBoot的事件监听

    事件监听的流程分为三步:1.自定义事件,一般是继承ApplicationEvent抽象类.2.定义事件监听器,一般是实现ApplicationListener接口.3.a.启动的时候,需要将监听器加入 ...

  10. spring事件监听(eventListener)

    原理:观察者模式 spring的事件监听有三个部分组成,事件(ApplicationEvent).监听器(ApplicationListener)和事件发布操作. 事件 事件类需要继承Applicat ...

随机推荐

  1. gorm插入报错Error 1292 (22007): Incorrect datetime value: ‘0000-00-00‘ for column ‘xxx‘ at row 1

    在MySQL中,'0000-00-00 00:00:00'不是一个合法的DATETIME值.从MySQL 5.7.5开始,默认情况下不允许插入零日期或零时间值到DATETIME或 TIMESTAMP列 ...

  2. Font-awesome失效恢复

    Font-awesome失效恢复策略 可能的原因有: 1.用了收费pro的版本,没充钱. Font Awesome 6 字体分为 Free 和 Pro 两个版本.Font Awesome 6 Free ...

  3. SVG path 标签根据两点和角度绘制弧线

    同步发布:https://blog.jijian.link/2020-04-14/svg-arc/ 由于功能受限,此处不能放 iframe 嵌入链接,如需看到实时效果,请移步 https://blog ...

  4. docker login harbor x509: certificate signed by unknown authority

    前言 docker login harbor x509: certificate signed by unknown authority 解决 打开 /etc/docker/daemon.json,如 ...

  5. MUX-VLAN

    MUX VLAN(Multiplex VLAN)是一种高级的VLAN技术,它通过在交换机上实现二层流量隔离和灵活的网络资源控制,提供了一种更为细致的网络管理方式. 一.基本概念 MUX VLAN分为主 ...

  6. .NET Core奇技淫巧之WinForm使用Python.NET并打包

    前言 之前整了一个GZY.EFCoreCompare 的库,可以用做对比实体与数据库结构.感兴趣可以去看看,地址:GZY.EFCoreCompare 但是只能导出execl表格. 后来大佬用Pytho ...

  7. Docker 1.12 :认识 Swarm 模式下的节点崩溃处理

    Posted on 2016年7月25日 上周小编为大家推荐了<Docker 1.12:用 Swarm 模式创建 Swarm 集群>,本周我们将深入为大家解读 1.12 版本 Docker ...

  8. Service Reliability Management: A Comprehensive Overview

    Service Reliability Management: A Comprehensive Overview Service reliability management is a critica ...

  9. Fast Prefix Sum Implementation Using Subgroups in GLSL Compute Shaders

    利用 Vulkan 1.1 的 subgroup 特性加速 ComputeShader 的前缀和计算,参考: Vulkan Subgroup Tutorial - Khronos Blog - The ...

  10. .net WorkFlow 流程设计

    WikeFlow官网:www.wikesoft.com WikeFlow学习版演示地址:workflow.wikesoft.com WikeFlow学习版源代码下载:https://gitee.com ...