首页 > 其他分享 >springboot 事件监听@EventListener注解用法

springboot 事件监听@EventListener注解用法

时间:2023-04-19 20:16:07浏览次数:27  
标签:info log TestEventVo testEventVo EventListener handle1 监听 springboot

前言

关于@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.所有处理方法都执行完后,才会返回给前端

标签:info,log,TestEventVo,testEventVo,EventListener,handle1,监听,springboot
From: https://www.cnblogs.com/daen/p/17334458.html

相关文章

  • SpringBoot利用Filter获取请求数据request和修改返回response中的数据
    WrapperedRequestimportjavax.servlet.ReadListener;importjavax.servlet.ServletInputStream;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;importjava.io.*;publicclassWrapperedRequestextendsHttpSe......
  • springboot学习之五(自动配置)
    一、@Conditional源码springboot的自动配置是通过@Conditional注解(条件判断)实现的.@Conditional是Spring4版本新提供的一种注解,它的作用是按照设定的条件进行判断,把满足判断条件的bean注册到Spring容器。packageorg.springframework.context.annotation;importjava.lang.a......
  • 创建idea springboot(spring Initializr项目)需要手动导包)
    用注解@RestController 的时候,报错:找不到符号原来是没有import这个包,复制粘贴 @RestController 的时候,idea并没有自动import这个包,导致找不到,要手动import。手动导入就行了。另外,如果是创建的maven项目,由于main类文件的放置位置不同,也会报错:nested exception is java.lang.I......
  • @SpringBootApplication等四个爆红
    在黑马的上面学习,按步骤做,出现爆红问题,之后尝试过很多方法,后发现没导包。导包后可以 ......
  • Java SpringBoot 加载 yml 配置文件中字典项
    将字典数据,配置在yml文件中,通过加载yml将数据加载到Map中SpringBoot中yml配置、引用其它yml中的配置。#在配置文件目录(如:resources)下新建application-xxx必须以application开头的yml文件,多个文件用","号分隔,不能换行项目结构文件application.ymlserver:po......
  • oracle无监听
    转载:https://blog.csdn.net/qq_34621658/article/details/98939526只执行前两步就可以管理员登录用户名:system口令:orcl数据库:Administrator:1521/oracle连接为:SYSTEM 注意:数据库Administrator是电脑本机用户名,不是这个的其修改为自己的用户名......
  • 事件监听——拖拽事件drag
    在项目中遇到需要拖拽元素的需求,一开始考虑的是鼠标的mousedown、mouseup、mousemove等事件组合,之后研究发现元素本身存在drag事件,可以直接调用监听:/***添加监听事件,实现拖拽功能*/handleAddDomListen(){//具体拖拽元素constRefs=this.$refs.layouts......
  • springboot项目 宿舍管理系统 (源码+数据库文件+1w字论文+ppt)
    来了就点个赞再走呗,即将毕业的兄弟有福了文章底部获取源码springboot项目宿舍管理系统(源码+数据库文件+1w字论文+ppt)技术框架:java+springboot+vue+mysql后端框架:SpringBoot、SpringMVC、MyBatisPlus前端界面:vue、BootStrap、jQuery、ajxs系统共分为三种用户系统主要功......
  • springboot
    介绍springboot是spring项目中的一个子工程,前者的实现是基于spring的。springboot的特点:“开箱即用”和“约定大于配置”使用pom配置1)添加父工程依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>......
  • SpringBoot中配置Swagger2
    首先在pom.xml添加springfox-swagger2和springfox-swagger-ui两个依赖,并且spring-boot-starter-parent的版本不能太高,可以设置为2.1.6.RELEASE<!--https://mvnrepository.com/artifact/io.springfox/springfox-swagger2--><dependency> <groupId>io.springfox</groupId>......