SpringBoot-自定义监听器

news/2025/2/23 2:34:02/

Spring Boot提供了强大的事件模型,其中包括多种内置监听器,同时也支持开发者自定义监听器。通过实现`ApplicationListener`接口,开发者可以创建自己的监听器,并在Spring Boot应用程序中进行配置。这样一来,在特定的应用程序事件发生时,自定义监听器就能够捕捉到并执行相应的操作,比如读取配置文件、初始化数据等。

自定义监听器的使用不仅仅是为了满足基本的业务需求,更是为了提高应用程序的可维护性和可靠性。通过监控应用程序的运行状态,开发人员可以更加及时地发现潜在的问题,并采取相应的措施。这有助于降低应用程序的故障风险,提高系统的稳定性。

此外,自定义监听器为开发人员提供了一种灵活的扩展方式,使其能够更好地适应不同的业务场景。开发者可以根据具体需求实现不同的监听器,以满足特定功能或业务逻辑的要求。这种灵活性使得Spring Boot应用程序更具可扩展性,更容易应对日益变化的业务需求。

自定义监听器作为Spring Boot框架中强大而灵活的一部分,为开发人员提供了有效的工具,帮助他们更好地监控和管理应用程序,同时为系统的可靠性和可维护性注入了更多的可能性。


一、创建自定义监听器

要创建自定义监听器,首先需要新建一个类,我们称之为MyApplicationListener,并确保该类继承了ApplicationListener接口。这一接口规定了一个名为onApplicationEvent的方法,我们将在这个方法中定义我们监听到特定应用程序事件时的操作。下面是一个简单的实例:

MyApplicationListener.java代码:

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Component
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {@Overridepublic void onApplicationEvent(ApplicationEvent event) {// 在这里编写监听到特定应用程序事件时的操作// 例如,利用RedisUtil工具类往Redis里写入数据RedisUtil.writeDataToRedis();}
}

在上述代码中,MyApplicationListener类通过实现ApplicationListener接口,成为了一个Spring Bean(通过@Component注解)。这使得Spring Boot应用程序能够自动扫描并注册这个监听器。 


二、利用RedisUtil工具类写入数据

为了在onApplicationEvent方法中使用RedisUtil工具类往Redis里写入数据,我们需要确保RedisUtil类已经存在,并且包含了相关的写入方法。下面是一个简单的示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;@Component
public class RedisUtil {private final RedisTemplate<String, String> redisTemplate;@Autowiredpublic RedisUtil(RedisTemplate<String, String> redisTemplate) {this.redisTemplate = redisTemplate;}public void writeDataToRedis() {// 在这里编写往Redis里写入数据的逻辑redisTemplate.opsForValue().set("key", "value");}
}

在上述代码中,RedisUtil类通过@Component注解成为了一个Spring Bean,使得它可以被其他组件自动注入。writeDataToRedis方法可以根据具体需求编写,执行向Redis写入数据的相关逻辑。

通过这样的设计,我们成功创建了一个自定义监听器MyApplicationListener,在特定应用程序事件发生时,它会调用RedisUtil工具类的方法,实现了向Redis写入数据的功能。这种结构既利用了Spring Boot的事件模型,又灵活地整合了自定义逻辑,为应用程序提供了更多的扩展性和定制化的可能性。


三、测试自定义监听器

接下来,我们将进行自定义监听器的测试,确保它在项目加载时能够自动运行并执行相关操作。

1、观察控制台输出

启动项目,并仔细观察控制台输出。若一切配置正确,你应该能够看到与自定义监听器相关的日志信息。这些日志表明监听器在特定应用程序事件发生时被触发,执行了相应的操作。

我们往监听器里添加日志代码:

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Component
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {@Overridepublic void onApplicationEvent(ApplicationEvent event) {// Spring Boot 应用启动后执行该方法System.out.println("Spring Boot 应用启动...");// 在这里编写监听到特定应用程序事件时的操作// 例如,利用RedisUtil工具类往Redis里写入数据RedisUtil.writeDataToRedis();System.out.println("将数据存入 Redis 中...");}
}

启动项目,观察控制台,看到我们的log已经被打出了。

这表示MyApplicationListenerApplicationEvent发生时被触发。 

2、检查Redis是否成功存入

接着,我们来进行第二项测试,确保数据已成功存入Redis。我们要通过访问Redis服务,检查相关数据是否已被写入。具体方法我们采用使用命令行工具或可视化工具连接到Redis服务器的形式,检查键值对是否存在。我们在writeDataToRedis方法中写入了键为 "key"、值为 "value" 的数据,应该在Redis中可以看到相应的数据。 

我们去访问Reids服务,看内容是否已经被存入Redis,看到已经被存入。输入Keys,获得Redis服务保存的所有键值对,如果成功的话,可以看到我们刚刚存入的<"key", “value”>键值对的key,也就是字符串"key"。

通过以上两个测试步骤,我们已经验证自定义监听器在按照预期工作。


四、自定义监听器的四种实现方式

在Spring Boot中,我们可以通过不同的方式来自定义监听器。以下是几种常见的方法,以及简单的示例:

1、实现ApplicationListener接口

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Component
public class CustomEventListener implements ApplicationListener<ApplicationEvent> {@Overridepublic void onApplicationEvent(ApplicationEvent event) {// 处理事件逻辑System.out.println("Custom Event Received: " + event.toString());}
}

2、使用@EventListener注解

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class AnotherCustomEventListener {@EventListenerpublic void handleCustomEvent(CustomEvent customEvent) {// 处理事件逻辑System.out.println("Another Custom Event Received: " + customEvent.toString());}
}

在这个例子中,CustomEvent是自定义的事件类,根据需要定义自己的事件。 

3、实现ApplicationEventPublisherAware接口

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;@Component
public class CustomEventPublisher implements ApplicationEventPublisherAware {private ApplicationEventPublisher eventPublisher;@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.eventPublisher = applicationEventPublisher;}public void publishCustomEvent(String message) {// 创建并发布自定义事件CustomEvent customEvent = new CustomEvent(this, message);eventPublisher.publishEvent(customEvent);}
}

上述示例中的CustomEvent是一个自定义的事件类,根据实际需求创建。 

4、使用@Async注解实现异步监听

import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;@Component
public class AsyncEventListener {@Async@EventListenerpublic void handleAsyncEvent(CustomAsyncEvent asyncEvent) {// 异步处理事件逻辑System.out.println("Async Custom Event Received: " + asyncEvent.toString());}
}

通过在方法上添加@Async注解,可以使监听器在异步线程中处理事件。


http://www.ppmy.cn/news/1297483.html

相关文章

从规则到神经网络:机器翻译技术的演化之路

在本文中&#xff0c;我们深入探讨了机器翻译的历史、核心技术、特别是神经机器翻译&#xff08;NMT&#xff09;的发展&#xff0c;分析了模型的优化、挑战及其在不同领域的应用案例。同时&#xff0c;我们还提出了对未来机器翻译技术发展的展望和潜在的社会影响。 一、概述 机…

k8s yaml文件pod的生命周期

Pod是k8s中最小限额资源管理组件&#xff0c;也是最小化运行容器化的应用的资源管理对象。 Pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合。 在一个pod当中运行一个容器是最常用的方式。 在一个pod当中同时运行多个容器&#xff0c;在一个pod当中…

婚庆小程序集成多商家管理以及总后台管理不再需要电脑一个小程序解决所有管理

#后台管理不需要电脑# #一个小程序搞定多商户# 啥也不说&#xff0c;先来个图片看看。新闻编辑&#xff0c;分类编辑&#xff0c;信息管理都不需要电脑来操作了。一切归顺于手机。一个小程序来解决。

Python学习笔记第七十九天(OpenCV轨迹栏)

Python学习笔记第七十九天 OpenCV轨迹栏cv.createTrackbarcv.getTrackbarPos两者合并运用 后记 OpenCV轨迹栏 cv.getTrackbarPos 和 cv.createTrackbar 是 OpenCV 库中用于创建和获取跟踪条位置的函数。这些函数通常用于在视频处理或图像处理应用程序中创建用户界面&#xff0…

Python - Bert-VITS2 自定义训练语音

目录 一.引言 二.前期准备 1.Conda 环境搭建 2.Bert 模型下载 3.预训练模型下载 三.数据准备 1.音频文件批量处理 2.训练文件地址生成 3.模型训练配置生成 4.训练文件重采样 5.Tensor pt 文件生成 四.模型训练 1.预训练模型 2.模型训练 3.模型收菜 五.总结 一…

编码技巧(二) element-ui table中根据状态控制是否可以勾选

项目中使用element-ui时,表格中的数据有不同的状态,需要对某个状态的数据进行 勾选操作 如图所示: 只有id为12的符合条件可以进行勾选 <el-table-column type="selection" header-align="center" :selectable="selectable" align="c…

C语言学习NO.11-字符函数strlen,strlen函数的使用,与三种strlen函数的模拟实现

&#xff08;一&#xff09;strlen函数的使用 strlen函数的演示 #include <stdio.h> #include <string.h>int main() {char arr1[] "abcdef";char arr2[] "good";printf("arr1 %d,arr2 %d",strlen(arr1),strlen(arr2));return …

C++ 手写堆 || 堆模版题:堆排序

输入一个长度为 n 的整数数列&#xff0c;从小到大输出前 m 小的数。 输入格式 第一行包含整数 n 和 m 。 第二行包含 n 个整数&#xff0c;表示整数数列。 输出格式 共一行&#xff0c;包含 m 个整数&#xff0c;表示整数数列中前 m 小的数。 数据范围 1≤m≤n≤105 &…