重学SpringBoot3-事件与监听器

news2024/11/28 22:35:45

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-事件与监听器

  • 事件和监听器的基本概念
  • Spring Boot中的事件类型
    • 1. ApplicationStartingEvent
    • 2. ApplicationEnvironmentPreparedEvent
    • 3. ApplicationContextInitializedEvent
    • 4. ApplicationPreparedEvent
    • 5. ApplicationStartedEvent
    • 6. AvailabilityChangeEvent
    • 7. ApplicationReadyEvent
    • 8. AvailabilityChangeEvent
    • 9. ApplicationFailedEvent
  • 定义和使用自定义事件
    • 定义一个事件
    • 创建事件监听器
      • 实现ApplicationListener接口
      • 使用@EventListener注解
    • 发布事件
  • 事件的异步处理
  • 总结

Spring Framework 提供了一个强大的事件发布和监听机制,允许应用组件在发生特定操作时相互通信,而无需直接引用对方。这种基于事件的通信方式有助于实现松耦合的架构,增强应用的模块化。Spring Boot 3 继承并增强了这一机制,让开发者能够更便捷地使用事件和监听器来处理应用中的各种业务场景。本文将深入探讨 Spring Boot 3 中的事件和监听器,包括它们的工作原理、如何定义和使用它们,以及一些实际应用场景。

事件和监听器的基本概念

在 Spring 框架中,事件(Events)是对发生在应用程序或 Spring 上下文中的操作或更改的封装。事件可以由任何组件发布,并由感兴趣的组件(监听器)接收和处理。

监听器(Listeners)是定义了如何响应特定事件的组件。在 Spring 中,监听器订阅特定类型的事件,并在事件发生时被自动触发。

Spring Boot中的事件类型

9大事件

Spring Boot 的生命周期事件为应用的启动和关闭提供了详细的上下文信息,使得开发者能够根据不同阶段执行特定的逻辑。这些事件按照它们触发的顺序,大致可以分为以下九种:

1. ApplicationStartingEvent

  • 触发时机:这是第一个事件,它在运行 SpringApplication.run() 方法时触发,即应用启动的最早阶段,此时 Spring 应用上下文(ApplicationContext)还未创建。
  • 作用:可以用于执行一些最早期的初始化工作,比如注册监听器或初始化器等。

2. ApplicationEnvironmentPreparedEvent

  • 触发时机:当 SpringApplication 准备好 Environment(但在创建 ApplicationContext 之前)时触发。
  • 作用:允许修改配置属性或做一些基于环境的预处理。

3. ApplicationContextInitializedEvent

  • 触发时机:当 ApplicationContext 准备好但未加载任何 bean 定义时触发,这个事件是 Spring Boot 2.1 新增的。
  • 作用:适合在加载 bean 定义之前执行一些操作,比如注册自定义的bean定义。

4. ApplicationPreparedEvent

  • 触发时机:当 ApplicationContext 已经加载但还未刷新时触发,此时所有的bean定义都已加载但还未创建实例。
  • 作用:可以用于设置需要在刷新上下文之前完成的任何处理。

5. ApplicationStartedEvent

  • 触发时机:Spring Boot 2.2 中引入,替代了 ApplicationReadyEvent 作为上下文刷新后立即发布的事件,但在任何回调和应用程序(ApplicationRunner)和命令行运行器(CommandLineRunner)被调用之前。
  • 作用:标志着应用已经启动且准备好接收请求。

6. AvailabilityChangeEvent

  • 触发时机:Spring Boot 2.3 中引入,它是一个框架级事件,用于表示应用程序可用性(Availability)的状态变化,如LivenessState.CORRECT 应用存活,又叫存活探针
  • 作用:通过监听这些状态变化,应用可以做出相应的响应,在容器化环境中,存活状态用于指导容器编排系统(如 Kubernetes)决定是否需要重启容器。

7. ApplicationReadyEvent

  • 触发时机:在任何任何应用程序(ApplicationRunner)和命令行运行器(CommandLineRunner)被调用后,且 SpringApplication.run() 方法即将结束之前触发。
  • 作用:表示应用已经准备好接收HTTP请求,通常用于执行一些最终的启动逻辑。

8. AvailabilityChangeEvent

  • 触发时机:就绪状态ReadinessState.ACCEPTING_TRAFFIC 就绪探针,表示应用正在正常运行,没有遇到无法恢复的错误或故障。
  • 作用:在微服务架构中,就绪状态通常意味着服务已经完全启动,并且可以开始处理外部请求。

9. ApplicationFailedEvent

  • 触发时机:如果启动时出现异常,则触发此事件。
  • 作用:可以用于处理启动过程中的异常,进行错误记录或额外的错误处理逻辑。

通过监听和响应这些事件,开发者可以在应用的生命周期的关键时刻插入自定义逻辑,增强应用的灵活性和健壮性。这些事件提供了一种强大的机制,用于监控和管理应用的状态变化。

以上内容可以查看源码:org.springframework.boot.SpringApplication#run(java.lang.String…)

源码

定义和使用自定义事件

除了使用 Spring Boot 提供的事件外,你还可以定义自己的事件和监听器来处理特定的业务逻辑。以下是创建和使用自定义事件的步骤:

定义一个事件

自定义事件通常是 ApplicationEvent 的子类:

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;
    }
}

创建事件监听器

有两种方式可以创建事件监听器:实现 ApplicationListener 接口或使用 @EventListener 注解。

实现ApplicationListener接口

import org.springframework.context.ApplicationListener;

public class CustomEventListener implements ApplicationListener<CustomEvent> {
    @Override
    public void onApplicationEvent(CustomEvent event) {
        System.out.println("Received custom event - " + event.getMessage());
    }
}

使用@EventListener注解

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());
    }
}

发布事件

在Spring应用中,你可以通过 ApplicationEventPublisher 接口发布事件:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

@Component
public class CustomEventPublisher {

    @Autowired
    private ApplicationEventPublisher publisher;

    public void publishEvent(final String message) {
        CustomEvent customEvent = new CustomEvent(this, message);
        publisher.publishEvent(customEvent);
    }
}

测试事件

事件的异步处理

默认情况下,事件的处理是同步进行的,即事件监听器的处理逻辑会阻塞发布事件的线程。然而,Spring 也支持异步事件监听器,可以通过 @Async 注解来实现这一点。请注意,要使用 @Async,需要在配置类上开启异步支持:

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync
public class AsyncConfig {
}

然后,你可以在事件监听器上使用 @Async 注解:

import org.springframework.scheduling.annotation.Async;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class AsyncCustomEventListener {

    @Async
    @EventListener
    public void handleCustomEvent(CustomEvent event) {
        // 异步处理事件
    }
}

通过使用异步事件监听器,你可以提高应用的性能和响应能力,尤其是在处理耗时操作时。

异步事件监听

总结

Spring Boot 中的事件和监听器提供了一种强大且灵活的方式来实现应用组件间的松耦合通信。无论是使用 Spring Boot 内置的事件还是定义自己的自定义事件,事件驱动的机制都能帮助你构建更加模块化和可维护的应用。通过合理利用事件和监听器,以及掌握同步和异步事件处理的技巧,可以在 Spring Boot 应用中实现复杂的业务逻辑,同时保持代码的清晰和简洁。

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

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

相关文章

【InternLM 实战营第二期笔记】使用茴香豆搭建你的RAG智能助理

RAG RAG是什么 RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追…

2024年阿里云优惠券(代金券)在哪里领取?

阿里云作为国内领先的云计算服务提供商&#xff0c;不仅提供了稳定、高效的云服务&#xff0c;还时常推出各种优惠活动&#xff0c;以此来吸引用户上云。其中&#xff0c;阿里云优惠券就是一种常见的优惠方式。那么&#xff0c;在2024年&#xff0c;我们该如何领取阿里云优惠券…

在自定义数据集上微调 YOLOv9 模型

在自定义数据集上微调 YOLOv9模型可以显着提高目标检测性能,但这种改进有多显着呢?在这次全面的探索中,YOLOv9在SkyFusion数据集上进行了微调,分为三个不同的类别:飞机、船舶和车辆。通过一系列广泛的实验,包括修改学习率、图像大小和战略性冻结主干网,已经实现了令人印…

5. python练习题5-存款、收益率计算

5. python练习题5-存款、收益率计算 【目录】 文章目录 5. python练习题5-存款、收益率计算1. 目标任务2. 解题思路3. 知识回顾3.1 Python赋值运算符3.2 列表的append函数3.3 round()函数—保留小数点位数3.4 f格式化字符串3.5 列表求和方法 4. 程序代码4.1 使用循环结构实现4…

【强化学习的数学原理-赵世钰】课程笔记(二)贝尔曼公式

【强化学习的数学原理-赵世钰】课程笔记&#xff08;二&#xff09;贝尔曼公式 一. 内容概述 1. 第二章主要有两个内容 &#xff08;1&#xff09;一个核心概念&#xff1a;状态值&#xff08;state value&#xff09;&#xff1a;从一个状态出发&#xff0c;沿着一个策略我…

linux安装dubboAdmin

1.环境准备&#xff1a; jdk-8u391-linux-x64apache-maven-3.9.6apache-tomcat-8.5.100 2.安装注册中心zookeeper zookeeper的安装看我的另一篇文章&#xff0c;安装完成后保持启动状态 linux安装Zookeeper的详细步骤-CSDN博客 3.安装dubboadmin 源码下载地址&#xff1a;R…

隔离放大器 分类 及说明

无源传感器隔离配电及信号采集传输 ●前置放大、电桥等电路配置电源方便采集信号 ●PLC、DCS现场模拟信号隔离、采集 ●直流电流/电压信号的隔离、转换及放大 ●模拟信号地线干扰抑制及数据隔离、采集 ●工业现场信号隔离及长线传输 ●仪器仪表与传感器信号收发 ●电力监控、医…

【Django开发】0到1美多商城项目md教程第6篇:账号登录,1. 用户名登录逻辑分析【附代码文档】

美多商城完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;欢迎来到美多商城&#xff01;&#xff0c;项目准备。展示用户注册页面&#xff0c;创建用户模块子应用。用户注册业务实现&#xff0c;用户注册前端逻辑。图形验证码&#xff0c;图形验证码接口设…

Windows:IntelliJ IDEA Ultimate 安装 PHP 插件

在 IntelliJ IDEA Ultimate 中安装 PHP 插件&#xff0c;支持PHP开发调试 首先&#xff0c;进入File > Setting&#xff1a; 再次选择Plugins&#xff0c;然后选择上面的 Marketplace。 在搜索栏中输入 PHP&#xff0c;然后单击左侧的 Install 进行安装就可以了。 安装成功…

SD-WAN组成及关键技术解析

云桥通SD-WAN作为下一代网络连接技术&#xff0c;由控制平面、数据平面和管理平面三部分组成&#xff0c;共同构建了灵活、可管理和高效的网络架构。 1、控制平面&#xff1a; 控制平面负责决策制定和流量管理&#xff0c;在云桥通SD-WAN网络中扮演关键角色。基于软件定义网络…

转圈游戏——快速幂

目录 题目 思路 代码 题目 思路 每个小朋友移动一次的位置为&#xff0c;移动 q 次的位置则为。那么题目要求移动 &#xff0c;最后的位置为 。 但 的范围是&#xff0c;而总的移动次数是 。时间复杂度是在&#xff0c;因此是一定不能硬算的&#xff0c;肯定会超时。那么该…

【架构七】Hadoop

什么是Hadoop? Hadoop是一个存储系统计算框架的软件大数据处理框架。 Hadoop的核心&#xff0c;说白了就是HDFS和MapReduce&#xff0c;HDFS为海量数据提供了存储&#xff0c;而MapReduce为海量数据提供了计算框架。HBase是一个分布式的、面向列的开源数据库。属于Nosql。 …

微信小程序之事件

1、什么是事件 UI界面的程序需要和用户互动&#xff0c;例如用户可能会点击你界面上某个按钮&#xff0c;又或者长按某个区域&#xff0c;这类反馈应该通知给开发者的逻辑层&#xff0c;需要将对应的处理状态呈现给用户。 有些时候程序上的“行为反馈”不一定是用户主动触发的&…

详解简单的shell脚本 --- 命令行解释器【Linux后端开发】

首先附上完整代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> //命令行解释器 //shell 运行原理&#xff1a;通过让子进程执行命令&#xff0c;父进…

计算机体系结构(1) 介绍和基础

为了跟上我们组学习的进度&#xff0c;打好体系结构的基础&#xff0c;接下来我会持续的学习计算机体系结构的知识。参考的课程是 苏黎世联邦理工 ETH Zurich&#xff1a;Digital Design and Computer Architect Lecture 1: Introduction and Basics_哔哩哔哩_bilibili 这一…

BioXCell,1H6--InVivoMAb anti-canine CD34

1H6单克隆抗体与犬CD34发生反应。CD34是一种I型单体唾液酸粘蛋白样糖蛋白&#xff0c;存在于许多干细胞群体中。CD34由骨髓和外周血中的造血祖细胞以及一些间充质干细胞、基质细胞、胚胎成纤维细胞、肿瘤细胞和成人血管内皮细胞表达。CD34经常被用作量化用于造血干细胞移植后该…

根证书和中间证书安装配置

下载根证书 根证书是建立信任链的基础。一旦客户端安装了根证书&#xff0c;它即可验证由该根证书签发的所有证书。这使得客户端可以信任与该根证书相关的所有服务器和应用程序&#xff0c;从而建立起一个完整的信任链。 如果您的业务用户通过浏览器访问您的Web业务&#xff…

【uniapp】个推H5号码认证一键登录(附代码)

前言 最近在做APP、h5产品&#xff0c;登陆注册成了难题。邮箱验证多数人不会使用&#xff0c;还是短信方便点&#xff0c;短信可以采用号码认证和验证码的方式&#xff0c;前者稍微便宜的&#xff0c;关于性价比和上手程度我推荐个推&#xff0c; 于是有了今天这篇案例记录&a…

低代码如何集成多平台(企业微信、钉钉、飞书)SDK,且听我细细道来

前言 我们是一家做低代码产品开发的公司&#xff0c;我司的低代码产品支持在多个平台环境内使用&#xff1a;有钉钉、企业微信、微信、飞书、Web浏览器&#xff08;如谷歌&#xff09;&#xff0c;后续还会接入更多平台。面对这么多平台&#xff0c;每个平台的SDK可能一致&…

磁盘类型与IOPS性能指标

目录 1.磁盘的访问模式 2.磁盘分类 2.1 HDD机械磁盘 2.1.1 机械磁盘性能 2.1.2 IOPS 2.1.3 提升IOPS性能手段 2.1.4 RAID技术 RAID 0 RAID 1 RAID 5 RAID 6 RAID 10 RAID 50 RAID总结 2.2 SSD固态硬盘 2.2.1 查看磁盘调度算法 2.2.2 修改磁盘调度算法 2.2.3 …