当前位置: 首页 > news >正文

Spring framework Day 23:容器事件

前言

容器事件是 Spring Framework 中的一个重要概念,它提供了一种机制,使我们能够更好地了解和响应 Spring 容器中发生的各种事件。通过容器事件,我们可以在特定的时间点监听和处理容器中的各种状态变化、操作和事件触发,以实现更加灵活和可扩展的应用程序开发。

在本篇博客中,我们将深入探讨容器事件的概念及其使用方式。我们将介绍容器事件的作用和好处,以及如何定义和监听容器事件。同时,我们还将讨论一些常见的容器事件类型,并提供相应的示例代码和使用场景。

无论你是初次接触容器事件还是已经有一定经验的开发者,本篇博客都将帮助你更好地理解和利用容器事件来优化你的应用程序开发过程。

让我们开始探索容器事件的奇妙世界吧!

一、开始学习

1、新建项目,结构如下

2、添加 spring 依赖
 <!-- spring 的核心依赖 --><dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.23</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.4.5</version></dependency></dependencies>
 3、在 event 包下新建 MyEvent 事件类、MyEventListen 监听类

MyEvent 事件类

/*** @Date 2023-10-13* @Author qiu* 自定义事件对象,这个对象用于发布给 spring 容器,* 容器就会自动处理这个事件*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyEvent {/*** 事件消息*/private String message;}
  • @Data:这是一个Lombok注解,会自动生成getter、setter、toString、equals和hashCode等常用方法。
  • @AllArgsConstructor:这是一个Lombok注解,会生成一个包含所有参数的构造函数。
  • @NoArgsConstructor:这是一个Lombok注解,会生成一个无参的构造函数。

该类有一个字段message,用来存储事件消息。通过使用Lombok注解,可以简化类的编写过程,减少样板代码的书写。Lombok会在编译时自动为字段生成getter和setter方法,并为类生成toString、equals和hashCode等方法。

MyEventListen 监听类

/*** @Date 2023-10-13* @Author qiu* 自定义事件监听器,用于监听用户发布的事件并进行处理,* 监听器需要纳入容器管理*/
@Slf4j
@Component
public class MyEventListener {/*** 自定义事件监听方法,容器会将用户发布的* 事件对象传入这个方法中进行事件处理** @EventListener 用于标识当前方法为监听方法** @param event*/@EventListenerpublic void handlerEvent(MyEvent event) {log.info("处理事件:" + event.getMessage());}}
  • @Slf4j:这是一个Lombok注解,用于自动生成日志记录器(Logger)。
  • @Component:这是一个Spring注解,用于将该类标识为一个组件,让Spring容器能够扫描并管理该类的实例化和依赖注入。

该类中定义了一个名为handlerEvent的方法,并使用了@EventListener注解。这个注解表示该方法是一个事件监听器,用来处理特定类型的事件。在示例中,它处理类型为MyEvent的事件。

当应用程序触发一个MyEvent事件时,Spring框架会自动调用handlerEvent方法,并将触发的事件作为参数传递给该方法。方法内部通过日志记录器打印了处理事件的消息。

通过使用Spring的事件机制,可以实现模块之间的松耦合,让不同部分的代码能够响应和处理特定类型的事件。在其他地方触发MyEvent事件时,MyEventListener中的handlerEvent方法会被自动调用,从而实现事件的处理逻辑。

4、在 config 包下新建一个 Appconfig 配置类
@Configuration
@ComponentScan(basePackages = "edu.nf.ch23")
public class AppConfig {
}
  • @Configuration:这是一个Spring注解,表示该类是一个配置类。配置类通常用来配置Spring应用程序上下文中的Bean。
  • @ComponentScan:这个注解告诉Spring容器去哪些包下面扫描组件类(被@Component或其他组件注解标记的类),并将它们注册到Spring容器中。

在示例中,basePackages参数指定了要扫描的基础包路径为edu.nf.ch23,Spring会自动扫描该包下的所有组件类并将它们注册到应用程序上下文中。

5、测试
public class Main {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 创建事件对象MyEvent hello = new MyEvent("hello");// 向容器发布事件context.publishEvent(hello);}}

运行结果

在main方法中,首先创建了一个AnnotationConfigApplicationContext对象,并传入了AppConfig.class参数。这个对象表示了一个Spring应用程序上下文,它通过加载AppConfig配置类来初始化应用程序上下文。

接着,创建了一个MyEvent对象,并传入一个字符串参数"hello"。这个对象是一个自定义的事件类型,它的构造函数接受一个字符串参数,用来存储事件消息。

最后,通过调用context的publishEvent方法来向应用程序上下文发布事件。这个方法接受一个事件对象作为参数,在示例中传入了之前创建的hello对象。

当事件被发布后,Spring容器会自动查找所有对该事件类型感兴趣的事件监听器,并调用它们的处理方法。在示例中,MyEventListener中的handlerEvent方法就是一个MyEvent事件的监听器,当事件被发布后,这个方法会被自动调用,并输出事件的消息。

二、使用容器事件有什么好处

 使用容器事件(Application Events)机制有以下好处:

  1. 松耦合:容器事件机制可以实现模块之间的松耦合,不同模块之间通过事件通信,各模块之间不直接依赖。

  2. 可维护性:容器事件机制可以帮助开发者将应用程序中的各个功能逻辑分离出来,使代码更加清晰、易于维护。

  3. 可扩展性:容器事件机制可以让开发者很方便地在代码中添加或删除事件监听,从而使应用程序具有更高的可扩展性和灵活性。

  4. 可测试性:容器事件机制可以将代码的各个部分独立测试,从而简化测试过程并提高代码质量。

总的来说,容器事件是一种非常强大的机制,它能够让应用程序具有更高的可扩展性、可维护性和可测试性,从而提高代码的质量和开发效率。

三、总结

在实际开发中,我们可以在Spring应用程序上下文中注册一个或多个事件监听器,这些监听器会异步地处理在应用程序上下文中发布的事件。通过这种方式,我们可以将不同模块之间的逻辑分离,提高代码的清晰度和可读性。

因此,掌握容器事件机制对于一个Java开发人员来说是非常重要的,它可以帮助我们写出更加优秀、高效、可靠的代码。

四、gitee 案例

案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git

相关文章:

Spring framework Day 23:容器事件

前言 容器事件是 Spring Framework 中的一个重要概念&#xff0c;它提供了一种机制&#xff0c;使我们能够更好地了解和响应 Spring 容器中发生的各种事件。通过容器事件&#xff0c;我们可以在特定的时间点监听和处理容器中的各种状态变化、操作和事件触发&#xff0c;以实现…...

【Dockerfile】基于openjdk镜像添加常用命令工具

背景 官方openjdk镜像是Red Hat操作系统&#xff0c;可以使用microdnf命令安装 bash-4.4# cat /etc/redhat-release Red Hat Enterprise Linux release 8.5 (Ootpa)拉取openjdk镜像 docker pull openjdk:17.0.2 编写Dockerfile touch Dockerfile-openjdk-utilsFROM openjd…...

目录内图片转PDF(多图片打印助手)

最近同事经常找我帮她打印试卷&#xff0c;很奇葩的是&#xff0c;她的试卷都是*红书上下载的图片&#xff0c;一张张打印不好看&#xff0c;而且可能打印不完全&#xff0c;大小也不协调&#xff0c;所以有了这个脚本。 【需要给小孩打印图片格式的试卷时也比较实用】 -----…...

React TypeScript安装npm第三方包时,些包并不是 TypeScript 编写的

npm install types/包名称 例如&#xff1a;npm install types/jquery 学习链接...

Java 基础 面试 多线程

1.多线程 1.1 线程&#xff08;Thread&#xff09; 线程时一个程序内部的一条执行流程&#xff0c;java的main方法就是由一条默认的主线程执行 1.2 多线程 多线程是指从软硬件上实现的多条执行流程的技术&#xff08;多条线程由CPU负责调度执行&#xff09; 许多平台都离不开多…...

软考 系统架构设计师系列知识点之软件构件(1)

所属章节&#xff1a; 第2章. 计算机系统基础知识 第3节. 计算机软件 2.3.7 软件构件 1. 概述 构件又称为组件&#xff0c;是一个自包容、可复用的程序集。构建是一个程序集、或者说是一组程序的集合。这个集合可能会以各种方式体现出来&#xff0c;如源程序或二进制代码。这…...

RHCE8 资料整理(三)

RHCE8 资料整理 第三篇 网络相关配置第11章 网络配置11.1 网络基础知识11.2 查看网络信息11.3 图形化界面修改11.4 通过配置文件修改11.5 命令行管理11.6 主机名的设置 第12章 ssh12.1 ssh基本用法12.2 打开远程图形化界面12.3 ssh无密码登录12.4 ssh安全设置12.5 ssh限制用户1…...

C++ 使用httplib库,发送HTTP请求

简介 C 使用httplib库&#xff0c;发送HTTP请求 接口信息 ip地址 192.168.16.166 端口 8899 接口地址/abc/tk 请求方式GET 响应内容&#xff1a; { “result”: true, “message”: “”, “tk”: “yueguangsaxialexiangshuitan0ihai”, “datetimeout”: “2023-10-22 21…...

OceanBase自动安装部署演示环境demo

OceanBase自动安装部署 前提条件 官方给出硬件条件需要满足以下要求 本文操作系统为&#xff1a;Red Hat Enterprise Linux 8 64 位 下载链接&#xff1a;https://pan.baidu.com/s/1rZ39xJFhk0HdmC4wEJcxvg 提取码&#xff1a;c01x 下载并安装 all-in-one 安装包 执行如下…...

windows系统mysql服务启动失败

​ 原因 电脑重启navicat连接mysql失败&#xff0c;在电脑-管理-服务没有mysql服务 解决方案 找到mysql的安装目录进入bin目录 执行mysqld --install 进行重新安装 提示服务安装成功 net start mysql mysql 启动成功 ​...

B-tree(PostgreSQL 14 Internals翻译版)

概览 B树(作为B树访问方法实现)是一种数据结构&#xff0c;它使您能够通过从树的根向下查找树的叶节点中所需的元素。为了明确地标识搜索路径&#xff0c;必须对所有树元素进行排序。B树是为有序数据类型设计的&#xff0c;这些数据类型的值可以进行比较和排序。 下面的机场代…...

React环境初始化

环境初始化 学习目标&#xff1a; 能够独立使用React脚手架创建一个React项目 1.使用脚手架创建项目 官方文档&#xff1a;(https://create-react-app.bootcss.com/)    - 打开命令行窗口    - 执行命令      npx create-react-app projectName    说明&#xff1a…...

Hadoop3教程(二十八):(生产调优篇)NN、DN的多目录配置及磁盘间数据均衡

文章目录 &#xff08;148&#xff09;NN多目录配置&#xff08;149&#xff09;DataNode多目录配置及磁盘间数据平衡磁盘间数据均衡 参考文献 &#xff08;148&#xff09;NN多目录配置 NN多目录的意思是&#xff0c;本地目录可以配置成多个&#xff0c;且每个目录存放内容相…...

博客续更(五)

十一、后台模块-菜单列表 菜单指的是权限菜单&#xff0c;也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表&#xff0c;不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…...

看微功耗遥测终端机如何轻松应对野外环境挑战?

在野外&#xff0c;数据的实时监测和传输是至关重要的。无论是环境温度、湿度&#xff0c;还是水位、流量&#xff0c;都需要精准把控。然而&#xff0c;传统的监测方法往往受限于电源供应问题&#xff0c;而无法充分发挥其功能。这时候&#xff0c;一款微功耗遥测终端机&#…...

vue后台开发第一步

1、创建vue3.2的项目 2、安装前期组件 安装 安装 vue-router npm install vue-router4安装 vuex npm install vuexnext --save安装 element-plus npm install element-plus --save安装 element-plus图标 npm install element-plus/icons-vue 使用 创建router目录、目录下创…...

Vue3踩坑指南

vue.config.ts不起作用 关于项目 项目使用的还是vue-cli搭建的&#xff0c;底层还是webpack&#xff0c;没有使用新的vite搭建。 踩坑1&#xff1a;vue.config.ts不起作用 我本着既然是vue3 ts的项目&#xff0c;那么为了规范&#xff0c;项目中所有的js文件都得替换成ts文…...

第十七章 Java连接数据库

1.打卡“命令提示符”&#xff0c;用管理员身份运行 2.登录MySQL 3.创建库和表 4.使用Java命令查询数据库操作 5.右击——点击“Build Path”——选择第四个——找到包的位置——导入成功 一、创建java项目 二、连接数据库 1.注册驱动 2.获取链接 3.获取statment对象 4.…...

221 - Urban Elevations (UVA)

题目链接如下&#xff1a; Online Judge 首先&#xff0c;我的代码虽然AC了&#xff0c;但是是有问题的&#xff0c;uva的测试数据太水了所以侥幸通过而已。因为题目要求的数据是实数而非整数&#xff0c;我的代码是按所有数据都是整数来暴力做的……但因为刘汝佳的代码写得太…...

驱蚊“卷到”母婴,润本市值73亿

作者 | 若楠 禄存 排版 | Cathy 监制 | Yoda 出品 | 不二研究 从 " 驱蚊第二股 " 到 " 婴童护理第一股 " 润本终于敲钟了。 尽管宣称 " 婴童护理第一股 "&#xff0c;但实际上&#xff0c;润本最初是以驱蚊产品起家的。 10 月 17 日&#…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

Electron简介(附电子书学习资料)

一、什么是Electron&#xff1f; Electron 是一个由 GitHub 开发的 开源框架&#xff0c;允许开发者使用 Web技术&#xff08;HTML、CSS、JavaScript&#xff09; 构建跨平台的桌面应用程序&#xff08;Windows、macOS、Linux&#xff09;。它将 Chromium浏览器内核 和 Node.j…...

基于django+vue的健身房管理系统-vue

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;PyCharm 系统展示 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 摘要 健身房管理…...