springboot 事件监听@EventListener注解用法
前言
关于@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注解用法的更多相关文章
- SpringBoot事件监听机制及观察者模式/发布订阅模式
目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...
- SpringBoot事件监听机制源码分析(上) SpringBoot源码(九)
SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringApplicat ...
- 分享一下事件监听addEventListener----attachEvent的用法
来自:http://www.cnblogs.com/wkylin/archive/2011/10/09/2203161.html 事件监听addEventListener----attachEvent ...
- SpringBoot事件监听
代码演示: package com.boot.event.eventdemo; import org.springframework.boot.SpringApplication; import or ...
- (12)JavaScript之[事件][事件监听]
事件 /** * 事件: * onload 和 onunload 事件在用户进入或离开页面时被触发 * * onchange事件常结合对输入字段的验证来使用 * onmouseover 和 onmou ...
- springBoot高级:自动配置分析,事件监听,启动流程分析,监控,部署
知识点梳理 课堂讲义 02-SpringBoot自动配置-@Conditional使用 Condition是Spring4.0后引入的条件化配置接口,通过实现Condition接口可以完成有条件的加载 ...
- springboot 中事件监听模型的一种实现
目录 定义事件本身 定义事件源 定义监听者 一.需要实现 ApplicationListener 二.使用 @EventListener 注解 测试 项目结构 前言: 事件监听模型是一种常用的设计模式 ...
- SpringBoot框架(6)--事件监听
一.场景:类与类之间的消息通信,例如创建一个对象前后做拦截,日志等等相应的事件处理. 二.事件监听步骤 (1)自定义事件继承ApplicationEvent抽象类 (2)自定义事件监听器,一般实现Ap ...
- SpringBoot的事件监听
事件监听的流程分为三步:1.自定义事件,一般是继承ApplicationEvent抽象类.2.定义事件监听器,一般是实现ApplicationListener接口.3.a.启动的时候,需要将监听器加入 ...
- spring事件监听(eventListener)
原理:观察者模式 spring的事件监听有三个部分组成,事件(ApplicationEvent).监听器(ApplicationListener)和事件发布操作. 事件 事件类需要继承Applicat ...
随机推荐
- 写于vue3.0发布前夕的helloworld之四
OK.接上回到render: with(this){return _c('div',{attrs:{"id":"app"}},[_v(_s(msg))])} 接 ...
- ssh WARNING: UNPROTECTED PRIVATE KEY FILE!
前言 在 ssh -i 指定密钥文件 登录时,出现以下报错: Permissions 0644 for 'xxxx' are too open. It is required that your pr ...
- dockerfile 由于公钥不可用,无法验证以下签名
报错 当我在打包 docker镜像时,发生了报错 $ sudo docker build -t dcgm-exporter:3.2.5 . 1.772 The following signatures ...
- ubuntu网络连接失败
首先要保证pc上可以连接上网络,然后进行下面的操作: 1.首先选择VMware的编辑选项 2.选择虚拟网络编辑器 3.还原默认设置,等待几分钟,确定就可以解决了
- SLAM建图导航信息(仿真)
博客地址:https://www.cnblogs.com/zylyehuo/ 基于[基于机器人自主移动实现SLAM建图],详见之前的博客 基于机器人自主移动实现SLAM建图 - zylyehuo - ...
- CSAPP学习笔记——chapter8 异常控制流
CSAPP学习笔记--chapter8 异常控制流 简介 异常控制流(Exceptional Control Flow,ECF)是在计算机系统中处理不寻常或异常情况的一种机制.它允许系统跳出正常的顺序 ...
- MySqlDataAdapter.Fill() 报异常‘给定关键字不在字典中’的解决方案
MySqlDataAdapter.Fill() 报异常'给定关键字不在字典中'的解决方案 解决办法 升级依赖库 后来发现居然是MySql.Data.dll文件版本问题,我开始使用的是6.2.1.0版本 ...
- D的SDK的设置
有点烦,被困扰.看大虾的文章一并感谢: 进入D:\Users\Public\Documents\Embarcadero\Studio\22.0\CatalogRepository\AndroidSDK ...
- C# 调用 Win10/11 文件关联对话框
方法一:调用未公开接口 IOpenWithLauncher Adobe Acrobat 应该是调用的未公开接口方法 [ComImport] [InterfaceType(ComInterfaceTyp ...
- DataPermissionInterceptor源码解读
本文首发在我的博客:https://blog.liuzijian.com/post/mybatis-plus-source-data-permission-interceptor.html 一.概述 ...