Spring framework Day 23:容器事件

news2025/1/19 17:21:16

前言

容器事件是 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
     */
    @EventListener
    public 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

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

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

相关文章

【网络编程】多路转接之select、poll、epoll

目录 一、如何进行高效的IO 以read/recv为例 二、五种IO模型 三、常见的高级IO 四、非阻塞IO 1、recv和send自带的非阻塞IO 2、可以将文件描述符设为非阻塞 2.1open自带的非阻塞IO 2.2通过fcntl函数将一个文件描述符设置为非阻塞 2.3非阻塞IO的返回值判定 三、多路转…

网络安全(黑客)自学方向

每年报考网络安全专业的人数很多&#xff0c;但不少同学听说千万别学网络安全&#xff0c;害怕网络安全专业很难就业。下面就带大家深入了解一下网络安全专业毕业后可以干什么&#xff0c;包括网络安全专业的就业前景和方向等。 随着信息化时代的到来&#xff0c;网络安全行业…

Intellij IDEA 运行时报 Command line is too long

文章目录 前言解决方法2020.3 之前的版本2020.3 以及之后版本 前言 有时候使用Intellij IDE 使用项目时&#xff0c;会出现“Command line is too long” 错误&#xff0c;查了很多资料才找到解决方案。为解决该错误颇费周折&#xff0c;写下此文让同道中人少走弯路。 解决方法…

ROL,PIT,YAW

简言之&#xff0c; roll是旋转角&#xff0c;是“翻滚”。绕X轴旋转,ROL pitch是俯仰角&#xff0c;是“点头“。绕Y轴旋转,PIT yaw是偏航角&#xff0c;是‘摇头“。绕Z轴旋转,YAW

软考考试时间已出!采用连考形式!

2023年下半年计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试批次安排已出&#xff01;下面是具体的考试安排。 通知原文如下&#xff1a;↓↓↓ 按照《2023年下半年计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试有关工作调整的通告》&#x…

代码随想录算法训练营第二十六天 | LeetCode 39. 组合总和、40. 组合总和 II、131. 分割回文串

代码随想录算法训练营第二十六天 | LeetCode 39. 组合总和、40. 组合总和 II、131. 分割回文串 文章链接&#xff1a;组合总和 组合总和II 分割回文串 视频链接&#xff1a;组合总和 组合总和II 分割回文串 目录 代码随想录算法训练营第二十六天 …

leetcode 5

leetcode 5 题目是通过枚举字符串&#xff0c;然后判断是否子字符串满足回文。 引用传递和值传递相比&#xff0c;引用传递可以减少内存空间。提高代码运行效率。 https://www.cnblogs.com/yanlingyin/archive/2011/12/07/2278961.html

ZKP4.1 SNARKs via Interactive Proofs (Justin Thaler)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 4: SNARKs via Interactive Proofs (Justin Thaler) 4.1 Interactive Proofs: Motivation and Model Interactive Proofs P solves problem, tells V the answer. Then they have a conversation.P’s goal: convince V the …

微信小程序一键获取位置

需求 有个表单需要一键获取对应位置 并显示出来效果如下&#xff1a; 点击一键获取获取对应位置 显示在 picker 默认选中 前端 代码如下: <view class"box_7 {{ showChange1? change-style: }}"><view class"box_11"><view class"…

Excel·VBA单元格区域数据对比差异标记颜色

之前的一篇博客《ExcelVBA单元格重复值标记颜色》&#xff0c;是对重复的整行标记颜色 而本文是按行对比2个单元格区域的数据&#xff0c;并对有差异的区域&#xff08;一个单元格区域有的&#xff0c;而另一个单元格区域没有的&#xff09;标记颜色&#xff0c;且只要存在任意…

杨辉三角按列求和

假设求杨辉三角这一列 我们考虑这个格子&#xff1a; 然后对其不断展开 综上&#xff1a; ∑ i 0 n ( i k ) ( n 1 k 1 ) \sum_{i0}^n\binom i k\binom {n1}{k1} i0∑n​(ki​)(k1n1​) ∑ i l r ( i k ) ( r 1 k 1 ) − ( l k 1 ) \sum_{il}^r\binom i k\binom{r1}{k…

Kafka存取原理与实现分析,打破面试难关

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 系列文章目录一、主题与分区1. 模型…

每日一博 - Code如何被发布到生产环境

文章目录 概述Flow 概述 关于公司如何将代码发布到生产环境的是一个什么样的流程呢&#xff1f; 下面的图示展示了典型的工作流程。 步骤 1&#xff1a;流程始于产品负责人根据需求创建用户故事。步骤 2&#xff1a;开发团队从积压工作中挑选用户故事&#xff0c;将它们放入…

Flutter——最详细(CustomScrollView)使用教程

CustomScrollView简介 创建一个 [ScrollView]&#xff0c;该视图使用薄片创建自定义滚动效果。 [SliverList]&#xff0c;这是一个显示线性子项列表的银子列表。 [SliverFixedExtentList]&#xff0c;这是一种更高效的薄片&#xff0c;它显示沿滚动轴具有相同范围的子级的线性列…

pycharm操作git

pycharm操作git 之前用命令做的所有操作&#xff0c;使用pychrm点点就可以完成 克隆代码 上方工具栏Git ⇢ \dashrightarrow ⇢ Clone ⇢ \dashrightarrow ⇢ 填写地址&#xff08;http、ssh&#xff09; 提交到暂存区&#xff0c;提交到版本库&#xff0c;推送到远程 直接…

IOday7

A进程 #include <head.h> int main(int argc, const char *argv[]) {pid_t cpidfork();if(cpid>0)//父进程向管道文件2写{ int wfd;if((wfdopen("./myfifo2",O_WRONLY))-1){ERR_MSG("open");return -1;} char buf[128]"";while(1){bze…

ps或游戏提示d3dcompiler_47.dll缺失怎么修复?常见的修复方法总结

在当今这个信息化的时代&#xff0c;计算机已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;随着软件的不断更新和升级&#xff0c;一些技术问题也时常困扰着我们。其中&#xff0c;d3dcompiler_47.dll缺失就是一个常见的问题。本文将详细介绍五种修复方案&#xf…

CART(classification and regression tree)

基尼指数 在分类问题中&#xff0c;假设有K个类&#xff0c;样本点属于第k类的概率为pk&#xff0c;则概率分布的基尼指数定义为 Gini指数越小表示集合的纯度越高&#xff0c;反之&#xff0c;集合越不纯 CART CART分类树默认使用基尼指数选择最优特征 常见数构建算法&#…

从零实现FFmpeg6.0+ SDL2播放器

FFmpeg6.0开发环境搭建播放器代码框架分析解复用模块开发实现包队列和帧队列设计音视频解码线程实现SDL2音频声音输出SDL2视频画面渲染-YUV显示音视频同步-基于音频 地址: https://xxetb.xet.tech/s/3NWJGf

Django项目配置

1 项目准备 1.1 创建test数据库&#xff0c;并导入数据&#xff0c;生成对应的表 登录数据库create database test;use test;导入数据创建表:source D:/Demo.sql; 1.2 安装Django及驱动程序: 安装django&#xff1a; pip install Django3.2.22 安装好后可使用命令&#xf…