详细分析Java中的@EventListener事件监听器(附Demo)

news2024/9/8 23:47:54

目录

  • 前言
  • 1. 基本知识
  • 2. Demo

前言

Java的基本知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. Spring框架从入门到学精(全)

1. 基本知识

用于标注一个方法为事件监听器

  • 事件监听器方法可以接收和处理发布的事件
  • 事件驱动编程模型广泛用于构建松耦合的系统组件,使得不同组件可以通过事件进行交互,而不需要直接依赖
    程序设计范式,程序的执行是由事件触发的,而不是顺序执行。在这种模型中,事件的产生、传播和处理是核心

事件和监听器

  • 事件:一个对象,通常包含与特定操作相关的信息
    例如,用户点击按钮、文件被修改等都可以视为事件
  • 监听器:一个对象,用于接收和处理事件
    通常实现一个接口,并包含一个方法用于处理特定类型的事件

Spring 框架中的事件机制
Spring 框架提供了一套完整的事件驱动机制,包含事件发布、事件监听等功能

  1. 自定义事件:用户自己定义的事件类,通常继承自 ApplicationEvent
  2. 事件发布:使用 ApplicationEventPublisher 接口发布事件
  3. 事件监听:使用 @EventListener 注解来标注方法,使其成为事件监听器

2. Demo

通过Demo了解整体的运行机制

Demo的类别如下:

  • CustomEvent 是自定义事件类
  • CustomEventPublisher 是事件发布者组件
  • CustomEventListener 是事件监听器组件
  • EventDemoApplication 是 Spring Boot 应用的入口类
  • EventDemoRunner 用于测试事件发布和监听的功能
  1. 自定义一个事件类
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;
    }
}
  1. 创建事件发布者组件
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

@Component
public class CustomEventPublisher {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void publishEvent(final String message) {
        CustomEvent customEvent = new CustomEvent(this, message);
        applicationEventPublisher.publishEvent(customEvent);
    }
}
  1. 创建事件监听器组件
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class CustomEventListener {
    @EventListener
    public void handleCustomEvent(CustomEvent event) {
        System.out.println("Received custom event - " + event.getMessage());
    }
}

本身是在Springboot的启动类,所以少不了

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class EventDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(EventDemoApplication.class, args);
    }
}

此处是Demo,对应还需要通过其他机制配合来触发这个事件

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class EventDemoRunner implements CommandLineRunner {
    @Autowired
    private CustomEventPublisher customEventPublisher;

    @Override
    public void run(String... args) throws Exception {
        customEventPublisher.publishEvent("Hello, World!");
    }
}

执行启动类,对应的结果如下:

在这里插入图片描述

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

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

相关文章

前端面试题43(JavaScript几种排序)

JavaScript 中有多种排序算法可供使用,每种算法都有其特点和适用场景。下面是一些常见的排序算法,它们可以手动实现,也可以通过 JavaScript 内置的 Array.prototype.sort() 方法简化操作。 1. 冒泡排序(Bubble Sort) …

beyond Compare连接 openWrt 和 VsCode

连接步骤总结 1. 新建会话 -> 文件夹比较 2.点击浏览文件夹 3.在弹出页面 配置 ftp 3.1)选中ftp 配置文件 3.2)选中ssh2 3.3)填写我们需要远端连接的主机信息 先点击连接并浏览 得到下方文件夹 弹出无效登录,说明需要密码 我们返回右键刚刚创建的新 …

qt 用数据画一个图,并表示出来

1.概要 想用数据绘制一个画面,看有相机到播放的本质是啥。 要点 // 创建一个QImage对象,指定图像的宽度、高度和格式 QImage image(width, height, QImage::Format_Grayscale8); // 将像素数据复制到QImage对象中 memcpy(image.bits(), pixelD…

Milvus Cloud:重塑向量数据管理新纪元的强大引擎

在大数据与人工智能技术日新月异的今天,数据不再仅仅是简单的数字堆砌,而是蕴含着无限价值的信息宝藏。随着深度学习、自然语言处理、计算机视觉等技术的飞速发展,由这些高级机器学习模型产生的向量数据正以惊人的速度增长,成为了驱动行业创新和业务智能化转型的关键力量。…

[leetcode]kth-smallest-element-in-a-sorted-matrix 有序矩阵中第k小元素

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool check(vector<vector<int>>& matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;…

Linux 调试命令记录

查看CPU信息 cat /proc/cpuinfo 显示当前电源功耗 top 命令能够清晰的展现出系统的状态&#xff0c;而且它是实时的监控&#xff0c;按 q 退出。 uptime 与 w 这两个命令只是单纯的反映出负载&#xff0c;所表示的是过去的1分钟、5分钟和15分钟内进程队列中的平均进程数量。…

中新青年领导人交流营走进李良济,零距离感受中医药文化的魅力

7月8日晚&#xff0c;2024中新青年领导人交流营在苏州正式启动。该交流营主题为“青年创业和可持续发展”&#xff0c;由中华全国青年联合会、新加坡全国青年理事会主办&#xff0c;江苏省、北京市青年联合会与苏州市人民政府承办&#xff0c;苏州市青年联合会与苏州工业园区管…

QT--SQLite

配置类相关的表&#xff0c;所以我使用sqlite,且QT自带该组件&#xff1b; 1.安装 sqlite-tools-win-x64-3460000、SQLiteExpert5.4.31.575 使用SQLiteExpert建好数据库.db文件&#xff0c;和对应的表后把db文件放在指定目录 ./db/program.db&#xff1b; 2.选择sql组件 3.新…

Github Action 自动部署更新静态网页服务

本文首发于 Anyeの小站&#xff0c;点击跳转 获得更优质的阅读体验 前言 贴一段胡话 在用过 应用&#xff1a;静态网页服务 之后&#xff0c;事实证明&#xff1a; 总而言之&#xff0c;自动化是一个很令人着迷的东西&#xff0c;摆脱重复繁琐的工作&#xff0c;解放了双手的…

51单片机嵌入式开发:7、 STC89C52RC 外部中断INT0和INT1 操作

STC89C52RC 外部中断INT0和INT1 操作 1 外部中断1.1 外部中断1.2 中断介绍 2 STC89C52外部中断2.1 外部中断引脚2.2 外部中断寄存器说明 3 STC89C52外部中断演示3.1 电平触发外部中断3.2 边沿触发外部中断3.3 Protues仿真 4 外部中断总结 1 外部中断 1.1 外部中断 单片机外部…

LLM+Agent技术

&#x1f4a1; Agent可以理解为某种能自主理解、规划决策、执行复杂任务的智能体。Agent 是让 LLM 具备目标实现的能力&#xff0c;并通过自我激励循环来实现这个目标。它可以是并行的&#xff08;同时使用多个提示&#xff0c;试图解决同一个目标&#xff09;和单向的&#xf…

告别中央服务器:Syncthing实现点对点文件同步

介绍 Syncthing 是一款开源的文件同步工具&#xff0c;可让您在多个设备之间同步文件。 它适用于 Mac OS X、Windows、Linux、FreeBSD、Solaris、OpenBSD等系统。 可以通过浏览器访问来配置和监控该应用程序。 Syncthing 具有以下特点: 1、点对点同步 2、无需中央服务器 …

如何从 Windows 照片库恢复删除的照片

数据丢失的主要原因之一是人为错误。更糟糕的是&#xff0c;回收站中没有备份&#xff0c;也没有已删除的文件。在这种情况下&#xff0c;数据恢复或专门的 Windows 图片恢复工具可以帮您恢复已删除的图片。 考虑到这一点&#xff0c;我们将讨论从 Windows 10 上的图库中恢复已…

基于Intel Chainer 和姿势检测的动作识别(人体、面部、手部关键点识别动作识别)

项目概述 目标 开发一个能够实时或近实时识别特定动作的系统&#xff0c;如运动姿势、表情变化或手势控制。实现对人体关键点的精确追踪&#xff0c;以便于分析和理解人的动态行为。 技术栈 Intel硬件&#xff1a;可能使用Intel的高性能计算平台&#xff0c;如Xeon处理器或…

【大数据技术】换新电脑了,如何快速迁移MySQL到新电脑上(含程序+数据),这样既快速又高效,省去了“各种安装+各种配置+各种迁移数据”带来的麻烦和时间

【大数据技术】换新电脑了&#xff0c;如何快速迁移MySQL到新电脑上(含程序数据 背景步骤总结 背景 很久没有写博文了哦&#xff0c;最近我换了新的笔记本,于是需要在新笔记本电脑上搭建MySQL环境&#xff0c;因为我原电脑上是安装的MySQL解压版&#xff0c;故我想偷偷懒&…

基于Android平台开发,购物商城

1. 项目功能思维导图 2. 项目涉及到的技术点 使用SQLite数据库实现数据存储使用CountDownTimer实现启动页倒计时使用SharedPreferences实现记住密码登录使用BottomNavigationView实现底部导航栏使用ActivityFragment实现底部导航栏页面之间切换使用RecyclerViewadapter实现商品…

Java 中的 switch 语句:类型支持与限制

Java 中的 switch 语句&#xff1a;类型支持与限制 1、switch 语句支持的数据类型2、switch 语句不支持的数据类型3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在 Java 中&#xff0c;switch 语句是一种用于多分支选择的控制结构…

vscode单独设置项目的字符集

vscode有个默认的字符集&#xff0c;直接修改这里的话将会修改整个vscode工具的字符集。如果不同的项目使用不同的字符集&#xff0c;就不能修改这个默认的设置了。而是需要针对每个项目进行修改。 修改方法&#xff1a; 使用shiftctrlp进入settings的菜单页面&#xff0c;点击…

ARM体系结构及接口技术介绍(一)相关概念 寄存器

文章目录 一、ARM相关概念1. 机器码&#xff1a;计算机可以识别的0和1组成的特殊的编码2. 汇编指令&#xff1a;编译器可以将每条汇编指令编译生成特定的计算机可以识别的机器码3. 汇编指令集&#xff1a;很多具有不同功能的汇编指令的集合4. 架构&#xff1a;基于不同的汇编指…

resistronic焊接机RMF10 RE120安装SSK10说明操作

resistronic焊接机RMF10 RE120安装SSK10说明操作