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日志并进行多维度分析。
目录
相关文章
|
7天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
156 0
|
7天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
1月前
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
47 3
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
164 2
|
23天前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
44 14
|
30天前
|
安全 Java
如何在 Java 中创建自定义安全管理器
在Java中创建自定义安全管理器需要继承SecurityManager类并重写其方法,以实现特定的安全策略。通过设置系统安全属性来启用自定义安全管理器,从而控制应用程序的访问权限和安全行为。
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
58 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
2月前
|
Java Spring
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
本文介绍了Spring Boot中静态资源的访问位置、如何进行静态资源访问测试、自定义静态资源路径和静态资源请求映射,以及如何处理自定义静态资源映射对index页面访问的影响。提供了两种解决方案:取消自定义静态资源映射或编写Controller来截获index.html的请求并重定向。
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问