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)机制有以下好处:
松耦合:容器事件机制可以实现模块之间的松耦合,不同模块之间通过事件通信,各模块之间不直接依赖。
可维护性:容器事件机制可以帮助开发者将应用程序中的各个功能逻辑分离出来,使代码更加清晰、易于维护。
可扩展性:容器事件机制可以让开发者很方便地在代码中添加或删除事件监听,从而使应用程序具有更高的可扩展性和灵活性。
可测试性:容器事件机制可以将代码的各个部分独立测试,从而简化测试过程并提高代码质量。
总的来说,容器事件是一种非常强大的机制,它能够让应用程序具有更高的可扩展性、可维护性和可测试性,从而提高代码的质量和开发效率。
三、总结
在实际开发中,我们可以在Spring应用程序上下文中注册一个或多个事件监听器,这些监听器会异步地处理在应用程序上下文中发布的事件。通过这种方式,我们可以将不同模块之间的逻辑分离,提高代码的清晰度和可读性。
因此,掌握容器事件机制对于一个Java开发人员来说是非常重要的,它可以帮助我们写出更加优秀、高效、可靠的代码。
四、gitee 案例
案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git
相关文章:
Spring framework Day 23:容器事件
前言 容器事件是 Spring Framework 中的一个重要概念,它提供了一种机制,使我们能够更好地了解和响应 Spring 容器中发生的各种事件。通过容器事件,我们可以在特定的时间点监听和处理容器中的各种状态变化、操作和事件触发,以实现…...
【Dockerfile】基于openjdk镜像添加常用命令工具
背景 官方openjdk镜像是Red Hat操作系统,可以使用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(多图片打印助手)
最近同事经常找我帮她打印试卷,很奇葩的是,她的试卷都是*红书上下载的图片,一张张打印不好看,而且可能打印不完全,大小也不协调,所以有了这个脚本。 【需要给小孩打印图片格式的试卷时也比较实用】 -----…...
React TypeScript安装npm第三方包时,些包并不是 TypeScript 编写的
npm install types/包名称 例如:npm install types/jquery 学习链接...
Java 基础 面试 多线程
1.多线程 1.1 线程(Thread) 线程时一个程序内部的一条执行流程,java的main方法就是由一条默认的主线程执行 1.2 多线程 多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行) 许多平台都离不开多…...
软考 系统架构设计师系列知识点之软件构件(1)
所属章节: 第2章. 计算机系统基础知识 第3节. 计算机软件 2.3.7 软件构件 1. 概述 构件又称为组件,是一个自包容、可复用的程序集。构建是一个程序集、或者说是一组程序的集合。这个集合可能会以各种方式体现出来,如源程序或二进制代码。这…...
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库,发送HTTP请求 接口信息 ip地址 192.168.16.166 端口 8899 接口地址/abc/tk 请求方式GET 响应内容: { “result”: true, “message”: “”, “tk”: “yueguangsaxialexiangshuitan0ihai”, “datetimeout”: “2023-10-22 21…...
OceanBase自动安装部署演示环境demo
OceanBase自动安装部署 前提条件 官方给出硬件条件需要满足以下要求 本文操作系统为:Red Hat Enterprise Linux 8 64 位 下载链接:https://pan.baidu.com/s/1rZ39xJFhk0HdmC4wEJcxvg 提取码:c01x 下载并安装 all-in-one 安装包 执行如下…...
windows系统mysql服务启动失败
原因 电脑重启navicat连接mysql失败,在电脑-管理-服务没有mysql服务 解决方案 找到mysql的安装目录进入bin目录 执行mysqld --install 进行重新安装 提示服务安装成功 net start mysql mysql 启动成功 ...
B-tree(PostgreSQL 14 Internals翻译版)
概览 B树(作为B树访问方法实现)是一种数据结构,它使您能够通过从树的根向下查找树的叶节点中所需的元素。为了明确地标识搜索路径,必须对所有树元素进行排序。B树是为有序数据类型设计的,这些数据类型的值可以进行比较和排序。 下面的机场代…...
React环境初始化
环境初始化 学习目标: 能够独立使用React脚手架创建一个React项目 1.使用脚手架创建项目 官方文档:(https://create-react-app.bootcss.com/) - 打开命令行窗口 - 执行命令 npx create-react-app projectName 说明:…...
Hadoop3教程(二十八):(生产调优篇)NN、DN的多目录配置及磁盘间数据均衡
文章目录 (148)NN多目录配置(149)DataNode多目录配置及磁盘间数据平衡磁盘间数据均衡 参考文献 (148)NN多目录配置 NN多目录的意思是,本地目录可以配置成多个,且每个目录存放内容相…...
博客续更(五)
十一、后台模块-菜单列表 菜单指的是权限菜单,也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表,不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…...
看微功耗遥测终端机如何轻松应对野外环境挑战?
在野外,数据的实时监测和传输是至关重要的。无论是环境温度、湿度,还是水位、流量,都需要精准把控。然而,传统的监测方法往往受限于电源供应问题,而无法充分发挥其功能。这时候,一款微功耗遥测终端机&#…...
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搭建的,底层还是webpack,没有使用新的vite搭建。 踩坑1:vue.config.ts不起作用 我本着既然是vue3 ts的项目,那么为了规范,项目中所有的js文件都得替换成ts文…...
第十七章 Java连接数据库
1.打卡“命令提示符”,用管理员身份运行 2.登录MySQL 3.创建库和表 4.使用Java命令查询数据库操作 5.右击——点击“Build Path”——选择第四个——找到包的位置——导入成功 一、创建java项目 二、连接数据库 1.注册驱动 2.获取链接 3.获取statment对象 4.…...
221 - Urban Elevations (UVA)
题目链接如下: Online Judge 首先,我的代码虽然AC了,但是是有问题的,uva的测试数据太水了所以侥幸通过而已。因为题目要求的数据是实数而非整数,我的代码是按所有数据都是整数来暴力做的……但因为刘汝佳的代码写得太…...
驱蚊“卷到”母婴,润本市值73亿
作者 | 若楠 禄存 排版 | Cathy 监制 | Yoda 出品 | 不二研究 从 " 驱蚊第二股 " 到 " 婴童护理第一股 " 润本终于敲钟了。 尽管宣称 " 婴童护理第一股 ",但实际上,润本最初是以驱蚊产品起家的。 10 月 17 日&#…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
