SpringBoot监听器

在Spring Boot中,你可以使用监听器来响应特定的事件。这些事件可以是Spring Boot应用生命周期中的某个阶段(如启动、关闭等),也可以是你自定义的业务事件。

1. 创建一个监听器

创建一个监听器有两种方法:实现ApplicationListener接口或使用@EventListener注解。

实现ApplicationListener接口

创建一个新的类并实现ApplicationListener接口,传入你想要监听的事件类型作为泛型参数。

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Component
public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent> {@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {System.out.println("Application is ready!");}
}

在这个例子中,我们创建了一个名为MyApplicationListener的监听器,它会在Spring Boot应用准备好之后执行一些操作(打印一条消息)。

使用@EventListener注解

你也可以通过在方法上添加@EventListener注解来创建一个监听器:

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class MyEventListener {@EventListenerpublic void handleApplicationReadyEvent(ApplicationReadyEvent event) {System.out.println("Application is ready!");}
}

2. 自定义事件

在 Spring Boot 中,自定义监听事件的步骤如下:

  1. 创建一个自定义事件类。这个类需要继承 ApplicationEvent 类。
import org.springframework.context.ApplicationEvent;public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}
}

在这个例子中,我们创建了一个名为 CustomEvent 的自定义事件类,它包含了一个字符串类型的 message 属性,用于存储事件的相关信息。

  1. 创建一个监听器类,实现 ApplicationListener 接口,并指定要监听的事件类型(这里是 CustomEvent):
import org.springframework.context.ApplicationListener;public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {System.out.println("Received custom event: " + event.getMessage());}
}
  1. 注册监听器到 Spring 容器。你可以使用自动扫描、手动注册 Bean 或使用 @EventListener 注解来完成这一任务。

  2. 发布自定义事件:现在你已经创建了自定义事件和监听器,可以使用 ApplicationContext 来发布你的自定义事件:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class EventPublisher {@Autowiredprivate final ApplicationContext context;public EventPublisher(ApplicationContext context) {this.context = context;}public void publishCustomEvent(String message) {context.publishEvent(new CustomEvent(this, message));}
}

在这个示例中,我们创建了一个 EventPublisher 类,它有一个注入的 ApplicationContext。当调用 publishCustomEvent() 方法时,会发布一个新的 CustomEvent,并将消息传递给监听器。

  1. 最后,在需要的地方调用 EventPublisher 类的 publishCustomEvent() 方法来触发事件:
@Autowired
private EventPublisher eventPublisher;// ...eventPublisher.publishCustomEvent("Hello from a custom event!");

这样,每当 publishCustomEvent() 被调用时,你的自定义监听器就会接收到事件并执行相应的操作。

3.springboot使用定时任务

这种方式很简单,主要就是先@EnableScheduling开启定时任务功能,然后在相应的方法上添加@Scheduled()中间写上相应的cron表达式即可。示例如下:


import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
public class ScheduleTask {@Scheduled(cron = "0/5 * * * * ?") //定时任务注解+cron表达式public void testScheduleTask() {System.out.println("执行定时任务" + LocalDateTime.now());}
}

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

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

相关文章

每天五分钟计算机视觉:谷歌的Inception模块的计算成本的问题

计算成本 Inception 层还有一个问题,就是计算成本的问题,我们来看一下55 过滤器在该模块中的计算成本。 原始图片为28*28*192经过32个5*5的过滤操作,它的计算成本为: 我们输出28*28*32个数字,对于输出的每个数字来说,你都需要执行 55192 (5*5为卷积核的大小,192为通道…

如何通过EventChannel实现Flutter与原生平台之间的双向通信

本文将介绍如何通过EventChannel实现Flutter与原生平台之间的双向通信。如果想了解如何通过MethodChannel实现Flutter调用Android原生平台的方法,可以参考上篇文章。 Flutter如何实现与Android底层平台通信,调用底层Android原生方法https://sgknight.blog.csdn.net/article/…

威雅学校快讯:携手未来,同梦而行,威雅学校喜迎英国姐妹校管理团队访校视察

威雅学校喜迎英国姐妹校访校团 Visit from our sister school in the UK 英国威科姆阿贝学校 威雅学校大家庭 WAS Family 常州威雅WASCZ 香港威雅WASHK 杭州威雅WASHZ 南京威雅WASNJ 向春而行&#xff0c;卓越可期。日前&#xff0c;四所威雅学校均先后迎来了英国姐妹学校W…

人工智能辅助下的人工心脏:未来医疗的奇迹

导言 人工智能在医学领域的应用不断创新&#xff0c;其中人工心脏作为医疗工程的重要方向&#xff0c;将为心血管疾病患者带来新的治疗可能性。本文将深入研究人工智能辅助下的人工心脏技术&#xff0c;其原理、应用以及对未来医疗的影响&#xff0c;探讨人工心脏的发展历程、面…

vue看板使用电子数字

1、下载字体 https://www.dafont.com/theme.php?cat302&text0123456789 2、下载后将压缩包解压,并上传到https://link.csdn.net/?targethttps%3A%2F%2Fwww.fontsquirrel.com%2Ftools%2Fwebfont-generator 然后下载 3、项目中使用 在Vue项目中的assets中新建fonts文件夹…

QEMU源码全解析 —— virtio(15)

接前一篇文章&#xff1a; 上一回讲解了virtio_pci_device_plugged函数的前两部分&#xff0c;本回继续讲解virtio_pci_device_plugged函数的其余部分。为了便于理解&#xff0c;再次贴出virtio_pci_device_plugged函数源码&#xff0c;在hw/virtio/virtio-pci.c中&#xff0c;…

Java_正则表达式

正则表达式 接下来&#xff0c;我们学习一个全新的知识&#xff0c;叫做正则表达式。正则表达式其实是由一些特殊的符号组成的&#xff0c;它代表的是某种规则。 正则表达式的作用1&#xff1a;用来校验字符串数据是否合法 正则表达式的作用2&#xff1a;可以从一段文本中查找…

【PHP入门】1.3-数据类型、转换、判断

-数据类型- 数据类型&#xff1a;data type&#xff0c;在 PHP中指的是存储的数据本身的类型&#xff0c;而不是变量的类型。 PHP是一种弱类型语言&#xff0c;变量本身没有数据类型。 1.3.1PHP的八种数据类型 在PHP中将数据分为三大类八小类&#xff1a; 简单&#xff0…

Android EditText 自动换行

/1、在 XML 布局文件中设置 EditText 的属性&#xff1a; <EditTextandroid:layout_width"match_parent"android:layout_height"wrap_content"android:maxLines"10" <!-- 设置最大行数 -->android:inputType"textMultiLine"…

什么是 DDoS ?如何识别DDoS?怎么应对DDOS攻击

什么是DDOS攻击 DDoS攻击&#xff08;Distributed Denial of Service Attack&#xff09;即分布式拒绝服务攻击&#xff0c;是一种利用分布式网络来发起大量的请求&#xff0c;占用目标服务器或网络资源的攻击行为。这种攻击方式可以瘫痪目标系统&#xff0c;导致其无法正常提供…

JSON Ajax

1. JSON概念 JSON&#xff0c;全称JavaScript Object Notation&#xff0c;即JavaScript对象表示法&#xff0c;是一种轻量级的数据交换格式。它基于JavaScript的子集&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。 JSON的诞生&#xff0c;是为了解决电…

openssl生成https

安装 openssl wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz tar -xzvf openssl-1.1.1g.tar.gz cd openssl-1.1.1g/ ./config make sudo make install 软连接 ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1 ln -s /usr/local/lib64/libcrypt…

Linux---Ubuntu软件卸载

1. 软件卸载的介绍 Ubuntu软件卸载有两种方式: 离线安装包的卸载(deb 文件格式卸载&#xff09;在线安装包的卸载(apt-get 方式卸载) 2. deb 文件格式卸载 命令格式: sudo dpkg –r 安装包名 -r 选项表示安装的卸载 dpkg 卸载效果图: 3. apt-get 方式卸载 命令格式: …

动态规划算法

文章目录 动态规划算法引子代码实现背包问题 动态规划算法 引子 背包问题&#xff1a;现有一个背包&#xff0c;容量为4磅。现有如下物品&#xff1a; 1、要求达到的目标为装入的背包的总价值最大&#xff0c;并且重量不超出 2、要求装入的物品不能重复 3.2、动态规划算法基…

ResNet 原论文及原作者讲解

ResNet 论文摘要1. 引入2. 相关工作残差表示快捷连接 3. 深度残差学习3.1. 残差学习3.2. 快捷恒等映射3.3. 网络体系结构普通网络 plain network残差网络 residual network 3.4. 实施 4. 实验4.1. ImageNet分类普通的网络 plain network残差网络 residual network恒等vs.快捷连…

【Hive】——DML

1 Load&#xff08;加载数据&#xff09; 1.1 概述 1.2 语法 LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1val1, partcol2val2 ...)]LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename [PARTITION (partcol…

代码随想录算法训练营第42天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

416. 分割等和子集 已解答 中等 相关标签 相关企业 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xf…

(C++)电话号码的字母组合

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题链接备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/letter-combinations-of-a-phone-number/subm…

龙迅LT6211B,HDMI1.4转LVDS,应用于AR/VR市场

产品描述 LT6211B 是一款用于 VR/ 显示应用的高性能 HDMI1.4 至 LVDS 芯片。 对于 LVDS 输出&#xff0c;LT6211B 可配置为单端口、双端口或四端口。对于2D视频流&#xff0c;同一视频流可以映射到两个单独的面板&#xff0c;对于3D视频格式&#xff0c;左侧数据可以发送到一个…

智能监控平台/视频共享融合系统EasyCVR如何做到不被其他软件强制终止?具体如下

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。国标GB28181流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频…