当前位置: 首页 > 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 日&#…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...