SpringEvent的使用

news2024/11/16 17:35:56

步骤:

  • 定义事件,继承ApplicationEvent

  • 定义监听,要么实现ApplicationListener接口,要么在方法上添加@EventListener注解

  • 发布事件,调用ApplicationContext.publishEvent()或者ApplicationEventPublisher.publishEvent();

1、导入maven工程,SpringEvent已经包含在spring-boot-starter-web中

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、创建实体类,用于封装操作日志信息

该实体类用来将操作日志中的信息进行数据库的保存

package com.event.domain;

import com.baomidou.mybatisplus.annotation.*;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 *
 * 日志操作实体类
 */
@ApiModel(description = "日志操作实体类")
@TableName(value ="pd_auth_event")
@Data
public class Event implements Serializable {
    /**
     * 操作IP
     */
    @ApiModelProperty("操作IP")
    @TableField(value = "requestIp")
    private String requestIp;

    /**
     * 日志类型 LogType{OPT:操作类型;EX:异常类型}
     */
    @ApiModelProperty("日志类型 LogType{OPT:操作类型;EX:异常类型}")
    @TableField(value = "type")
    private String type;

    /**
     * 操作人
     */
    @ApiModelProperty("操作人")
    @TableField(value = "userName")
    private String userName;

    /**
     * 操作描述
     */
    @ApiModelProperty("操作描述")
    @TableField(value = "description")
    private String description;

    /**
     * 创建时间
     */
    @ApiModelProperty("创建时间")
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    private LocalDateTime create_time;

    @ApiModelProperty(hidden = true)
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

3、创建事件类

定义系统日志事件,自定义事件需要继承ApplicationEvent

package com.event.event;

import com.event.domain.Event;
import org.springframework.context.ApplicationEvent;

/**
 * 定义系统日志事件
 */
public class SysLogEvent extends ApplicationEvent {
    public SysLogEvent(Event optLogDTO) {
        super(optLogDTO);
    }
}

4、创建监听器类

通过@EventListener注解标注对应的事件处理器,处理器会根据参数类型自动识别事件类型的

package com.event.listener;

import com.event.domain.Event;
import com.event.event.SysLogEvent;
import com.event.mapper.EventMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * 事件监听器,监听日志事件
 */
@Component
public class SysLogListener {
    @Autowired
    private EventMapper eventMapper;
    @Async
    @EventListener(SysLogEvent.class)
    public void saveSysLog(SysLogEvent event) {
        Event sysLog = (Event) event.getSource();
        long id = Thread.currentThread().getId();
        System.out.println("监听到日志操作事件:" + sysLog + " 线程id:" + id);
        //将日志信息保存到数据库...
        eventMapper.insert(sysLog);

    }
}

5、创建Controller,用于发布事件

①实现方式一:

private ApplicationContext applicationContext;

②实现方式二:

private ApplicationEventPublisher applicationEventPublisher;

package com.event.controller;

import com.baomidou.mybatisplus.extension.api.R;
import com.event.domain.Event;
import com.event.event.SysLogEvent;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;

/**
 * Event日志监听
 */
@Api(value = "/event", tags = {"Event日志监听"})
@RestController
@RequestMapping("/event")
@CrossOrigin
@Slf4j
public class EventController {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    /**
     * 日志监听测试
     * @return
     */
    @ApiOperation(value = "日志监听测试", notes = "日志监听测试", httpMethod = "GET")
    @GetMapping("/test")
    @ResponseBody
    public R test(){
        //构造操作日志信息
        Event logInfo = new Event();
        logInfo.setRequestIp("127.0.0.1");
        logInfo.setUserName("admin");
        logInfo.setType("OPT");
        logInfo.setDescription("查询用户信息");

        //构造事件对象
        ApplicationEvent event = new SysLogEvent(logInfo);

        //发布事件
        applicationEventPublisher.publishEvent(event);

        long id = Thread.currentThread().getId();
        System.out.println("发布事件,线程id:" + id);
        return R.ok("ok").setCode(200);
    }
}

6、启动项目并访问Controller可以发现监听器触发了

发布事件,线程id:58
监听到日志操作事件:Event(requestIp=127.0.0.1, type=OPT, userName=admin, description=查询用户信息, create_time=null) 线程id:105

7、查询数据库保存的操作日志

8、项目结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

附录C:Standard Parasitic Extraction Format(SPEF)

文章目录C.1 基础(Basics)C.2 格式(Format)C.3 完整语法知乎翻译圣经本附录将介绍标准寄生参数提取格式&#xff08;SPEFSPEFSPEF&#xff09;&#xff0c;它是IEEEStd1481IEEE\ Std\ 1481IEEE Std 1481标准的一部分。 C.1 基础(Basics) SPEFSPEFSPEF允许以ASCIIASCIIASCII交换…

代码整洁之道,好的代码就是为了更美好的生活。

美国童子军有一条简单的军规&#xff1a;让营地比你来时更干净。当梳理代码时&#xff0c;坚守此军规&#xff1a;每次 review 代码&#xff0c;让代码比你发现它时更整洁。 一位大神说过&#xff1a;“衡量代码质量的唯一有效标准&#xff1a;WTF/min”&#xff0c;并配了一个…

Manjaro通过源码编译jdk11

我在编译中遇到的最大的问题就是gcc版本问题&#xff0c;因manjaro是滚动更新&#xff0c;所以gcc也是很新的版本&#xff0c;导致无法编译jdk11 1 下载源码 网上根据关键词查找jdk源码&#xff0c;查找出来很多可以下载源码的链接&#xff0c;这里我们使用github去官方仓库&a…

yolov5-6.0网络添加小目标检测头 TensorRT部署

小目标检测使用TPH-YOLOv5 中的yolov5l-xs-tph.yaml模型&#xff1b;对其中的C3STR替换为C3模块&#xff1b;本文的TensorRT部署是基于yolov5l-xs-tph修改后的模型训练部署&#xff0c;其精度一般主要学习如何TensorRT部署&#xff0c;都是在wang-xinyu基础上简单修改&#xff…

中科大2008年复试机试题

中科大2008年复试机试题 文章目录中科大2008年复试机试题第一题问题描述解题思路及代码第二题问题描述解题思路及代码第三题问题描述解题思路及代码第四题问题描述解题思路及代码第一题 问题描述 一个十进制正整数转换成二进制有多少个1 示例1 输入:10 输出:2解题思路及代码…

数据分析之Excel

自定义格式 一、自定义格式的结构 方式一: 代码结构组成代码码分为四个部分&#xff0c;中间用”;”号分隔&#xff0c;具体如下: 正数格式;负数格式;零格式;文本格式 两个代码部分&#xff0c;则第一部分用于正数和零, 第二部分用于负数 一个代码部分&#xff0c;则该部分将用…

【跟彤砸学编程】——第二课(上)

嗨害嗨大家好&#xff0c;这里是彤砸&#xff01; 今天我们来看看——编程到底是个啥&#xff1f; 上节课滴链接~【跟彤砸学编程】——第一课 程序是什么&#xff1f; 程序数据算法&#xff1b; 数据 生活中到处都是数据—— 1,2,3,是数据 A,B,C是数据 图片是由像素构成&…

【CSDN年度总结】一个四线城市的程序员-苟延残喘

个人简介 首先本人从事软件开发工作近8年&#xff0c;在北京工作5年&#xff0c;2020年1月13号回来老家工作&#xff0c;已经整整3年了&#xff01;&#xff01;&#xff01; 现在做工业大数据方面工作&#xff0c;曾就职于华为做手机系统研发工作。 在一个四线城市坚守做一个…

速看|低代码平台公司流辰信息为实现企业高效办公积极赋能!

流辰信息&#xff0c;历经多年的砥砺奋斗&#xff0c;终于在低代码开发行业斩获越来越多的市场份额&#xff0c;是一家专注于研发低代码产品的低代码平台公司。在持续奋斗的年月中&#xff0c;流辰信息将持续增强研发创新能力&#xff0c;为各企业实现高效办公协作效率强劲赋能…

XC-15媒资管理系统集成

学习页面查询课程计划 需求分析 到目前位置,我们已经可以编辑课程计划信息并且上传课程视频,下一步我们要是心啊在线学习页面动态获取章节对应的视频并且进行播放,在线学习页面所需要的信息有两类,一类是课程计划信息,一类是课程学习信息(视频地址,学习进度等),如下图 在线学…

我与CSDN相识的一年

一、保持初心&#xff0c;笃定前行&#xff0c;回首2022 1、1 保持初心 回想起与CSDN的相识也是有一年多了。最初的相识也是我刚进入大学的时候。那个时候我还是懵懂无知的一个计算机类的大学生。在老师留下的一次任务中&#xff0c;我发现自己有点解决不了&#xff0c;想上网…

如何处理mybatis处理数据库关系中的多对一关系呢?

测试环境的搭建&#xff1a; 导入lombok&#xff1a; 不懂得小伙伴可移步这篇文章 新建实体类&#xff1a; 拿我们日常生活中最常见的举例&#xff1a;多个学生对应一个老师 对于学生这边而言&#xff0c;关联… 多个学生关联一个老师[多对一] 对于老师而言&#xff0c;集…

BGP(边界网关路由协议)小实验

目录实验要求ospf协议启动关于BGP基本知识点BGP关系建立的配置BGP的宣告实验要求 如下实验拓扑&#xff0c;各个自治系统区域和网段已经标注 基本的ip配置&#xff0c;环回配置就不再展示。 要求&#xff1a;除了R5的环回外&#xff0c;其他环回均可以互相访问 ospf协议启动…

C语言进阶——自定义类型——位段、枚举、联合

结构体 目录 一. 位段 1.概念 2.位段的内存分配 3.位段的跨平台问题 4.位段的应用 二. 枚举 1.枚举类型的定义 2.枚举的优点 3.枚举的使用 三. 联合&#xff08;共用体&#xff09; 1.联合类型的定义 ​编辑 2.联合的特点 3. 联合大小的计算 一. 位段 1.…

Git 合并多条commit

文章目录修改前开始修改第一种方式: 命令行第二种方式: Android Studio遇到冲突的解决办法第一种&#xff1a;修改到底,干就完事了第二种&#xff1a;回滚吧&#xff0c;有点慌修改前 开始修改 第一种方式: 命令行 git rebase -i 01fc32484fb2d2229aa20 // 这里对应的是init的…

osg fbo(四),将颜色缓冲区图片中的牛通过shader变绿

osg fbo&#xff08;三&#xff09;中&#xff0c;把整个屏幕变绿了&#xff0c;因为是把shader添加到了颜色缓冲区图片上了。如果只想把牛变绿&#xff0c;就需要把shader添加到原始场景根中。 即 osg::ref_ptr<osg::StateSet> statset_SceneRoot sceneRoot->getOr…

一、Java框架之Spring配置文件开发

文章目录1. 基础概念1.1 Spring Framework1.2 核心概念产生背景IoC、Bean、DI2. 入门案例2.1 普通Maven项目2.2 IoC入门案例2.3 DI入门案例3. bean配置3.1 bean基础配置bean的基础配置bean的别名配置bean的作用范围3.2 bean实例化实例化方法1&#xff1a;构造方法实例化方法2&a…

Chrome浏览器http访问跨越问题与解决方法

一、Chromium 内核&#xff08;<93版本&#xff09;跨越问题解决方法 设置Chrome浏览器的 disable-web-security, 实现跨域访问后端的接口。这个参数可以降低chrome浏览器的安全性&#xff0c;禁用同源策略&#xff0c;利于开发人员本地调试。 解决办法&#xff1a; 新建一…

【区间合并】AcWing 803. 区间合并

803. 区间合并 文章目录题目描述输入格式&#xff1a;输出格式&#xff1a;数据范围输入样例输出样例方法&#xff1a;区间合并解题思路代码复杂度分析&#xff1a;题目描述 给定 nnn 个区间 [li,ri][l_i,r_i][li​,ri​]&#xff0c;要求合并所有有交集的区间。 注意如果在端…

按键精灵免字库本地识别OCR

按键精灵免字库识别—基于百度飞桨PaddleOCR的RapidOCR前言为什么为什么有大漠了还要使用其它OCR为什么要使用RapidOCR开发PaddleOCR介绍PaddleOCR使用衍生项目版——小白方案按键精灵post调用图片转base64方法转json方法post调用JVM版改为mavenOcrEngine路径idea Run配置网页版…