Java-SpringBoot-04-自定义监听器及事件

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日常项目中,很多业务场景会用到监听器,比如在Service中处理业务时,我们需要记录一个操作的日志到数据库中,我们怎么实现呢?

上篇文章我们看到SpringBoot应用在启动时提供了几种事件的监听,今天来看下如何自定义一个监听器。

       日常项目中,很多业务场景会用到监听器,比如在Service中处理业务时,我们需要记录一个操作的日志到数据库中,我们怎么实现呢?

分析场景

       1.我们需要一个Service类来处理业务。

       2.在操作完或者报错的时候,要监听到事件并处理,所以需要一个监听类和一个事件类。


一、新建实体类

       实体类用来进行业务操作对象的映射。

packagecom.xing.studyboot.entity.dto;
importlombok.Data;
/***  业务日志记录实体类* @author xing**/@DatapublicclassBusinessLogDto {
/*** 业务类型*/privateStringtype;
/*** 业务处理时长*/privatelongbusinessTime;
/*** 业务处理结果*/privateStringresult;
/*** 请求参数*/privateStringparams;
/*** 操作者*/publicStringreceiver;
}


二、建一个事件,集成ApplicationEvent类

packagecom.xing.studyboot.event;
importorg.springframework.context.ApplicationEvent;
importcom.xing.studyboot.entity.dto.BusinessLogDto;
importlombok.Getter;
/***  业务日志事件* @author xing**/@GetterpublicclassBusinessLogEventextendsApplicationEvent {
privatestaticfinallongserialVersionUID=1L;
privateBusinessLogDtobusinessLogDto;
publicBusinessLogEvent(Objectsource, BusinessLogDtobusinessLogDto) {
super(source);
this.businessLogDto=businessLogDto;
  }
}


三、注册业务日志的监听器

       这里注册有多种方法,我们使用@Component注解,实现 ApplicationListener<BusinessLogEvent> 接口。

packagecom.xing.studyboot.listener;
importorg.springframework.context.ApplicationListener;
importorg.springframework.core.annotation.Order;
importorg.springframework.stereotype.Component;
importcom.xing.studyboot.entity.dto.BusinessLogDto;
importcom.xing.studyboot.event.BusinessLogEvent;
/***  注册业务日志的监听器* @author xing* @createTime*/@Component@Order(1)
publicclassBusinessLogListenerimplementsApplicationListener<BusinessLogEvent> {
@OverridepublicvoidonApplicationEvent(BusinessLogEventbusinessLogEvent) {
BusinessLogDtobusinessLogDto=businessLogEvent.getBusinessLogDto();
System.out.println("BusinessLogListener接收到的监听数据是->"+businessLogDto);
    }
}


四、在业务类中将事件发布到应用

packagecom.xing.studyboot.rest.service.impl;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.context.ApplicationContext;
importorg.springframework.stereotype.Service;
importcom.xing.studyboot.entity.dto.BusinessLogDto;
importcom.xing.studyboot.event.BusinessLogEvent;
importcom.xing.studyboot.rest.service.CommonService;
@ServicepublicclassCommonServiceImplimplementsCommonService {
@AutowiredprivateApplicationContextapplicationContext;
@OverridepublicStringindex() {
BusinessLogDtodto=newBusinessLogDto();
dto.setType("0");
dto.setResult("ok");
dto.setParams("params");
dto.setBusinessTime(20L);
dto.setReceiver("xinghua");
System.out.println("CommonServiceImpl->记录操作日志,发布事件到应用");
applicationContext.publishEvent(newBusinessLogEvent(this, dto));
return"CommonServiceImpl.index";
  }
}



测试发现,输出了监听到的发布事件。

image.png


五、也可以用@EventListener注解来注册监听器,等同于上面的实现 ApplicationListener<BusinessLogEvent> 接口。

@Async是异步监听

packagecom.xing.studyboot.listener;
importorg.springframework.context.event.EventListener;
importorg.springframework.core.annotation.Order;
importorg.springframework.scheduling.annotation.Async;
importorg.springframework.stereotype.Component;
importcom.xing.studyboot.entity.dto.BusinessLogDto;
importcom.xing.studyboot.event.BusinessLogEvent;
/***  使用注解的形式注册监听器* @author xing* @createTime*/@Component@Order(2)
publicclassBusinessLogAnnotationListener {
/*** 注册监听实现方法* @param businessLogEvent 业务处理推送事件*/@EventListener@Asyncpublicvoidregister(BusinessLogEventbusinessLogEvent) {
// 获取业务处理日志对象BusinessLogDtobusinessLogDto=businessLogEvent.getBusinessLogDto();
System.out.println("BusinessLogAnnotationListener接收到的监听数据是->"+businessLogDto);
    }
}

测试发现同样监听到了事件,ok!

image.png

@Order(2)注解可以设置监听器的优先级。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
22天前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
107 0
|
20天前
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
37 3
|
22天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
118 2
|
3月前
|
前端开发 JavaScript Java
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
本文介绍了一个结合SpringBoot和Python的实用功能,旨在监控iPhone 15的库存状态并通过邮件提醒用户。系统采用SpringBoot监听苹果官网API,解析JSON数据判断是否有货,并展示最近的库存记录。此外,还能自动触发Selenium+Python脚本实现自动化购买。文中详细介绍了技术栈、接口分析、邮件配置及自动化脚本的设置方法。该项目不仅适用于熟悉后端开发的人员,也适合回顾Layui和Jquery等前端技术。
52 0
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
|
14天前
|
安全 Java
如何在 Java 中创建自定义安全管理器
在Java中创建自定义安全管理器需要继承SecurityManager类并重写其方法,以实现特定的安全策略。通过设置系统安全属性来启用自定义安全管理器,从而控制应用程序的访问权限和安全行为。
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
54 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
2月前
|
Java Spring
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
本文介绍了Spring Boot中静态资源的访问位置、如何进行静态资源访问测试、自定义静态资源路径和静态资源请求映射,以及如何处理自定义静态资源映射对index页面访问的影响。提供了两种解决方案:取消自定义静态资源映射或编写Controller来截获index.html的请求并重定向。
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
|
26天前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
32 3
|
26天前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
58 1