Spring监听器不同的注册方式下带来的监听范围的变化

news2024/9/20 17:31:44

事件监听注册的几种方式

ApplicationContext下面简称AC

1.构建SpringApplication时注册(可以监听AC启动阶段事件)

// 方式一:
//写法1
SpringApplication application = new SpringApplicationBuilder().listeners(new ApplicationPidFileWriter()).build(args);
//写法2
SpringApplication springApplication = new SpringApplication();
        application.addListeners(new ApplicationPidFileWriter());

2.在META-INF/spring.factories中注册(可以监听AC启动阶段事件)

org.springframework.context.ApplicationListener=org.springframework.boot.context.ApplicationPidFileWriter

3.bean扫描(部分AC启动阶段事件无法监听)

@Component
public class ApplicationAvailabilityExporter {

    @EventListener
    public void onStateChange(AvailabilityChangeEvent event) {
        AvailabilityState state = event.getState();
        if (state.equals(ReadinessState.ACCEPTING_TRAFFIC)) {
            System.out.println("应用程序已经可以接受外部请求");
        } else if (state.equals(ReadinessState.REFUSING_TRAFFIC)) {
            System.out.println("应用程序拒绝接受外部请求");
        } else if (state.equals(LivenessState.BROKEN)) {
            System.out.println("应用程序不可用");
        } else if (state.equals(LivenessState.CORRECT)) {
            System.out.println("应用程序正常");
        }
    }
}

监听时机问题

springboot里面有部分事件是在ApplicationContext创建之前发布的。所以这就有有了上面的前两种注册方式,第三种注册方式,是我们最常见,也是业务中最常用的一种方式。

比如:

ApplicationStartingEvent 在SpringApplication的run方法内,它发布的时间会很早,在SpringApplicationRunListeners里面就包含着通过方法一和方法二注册的监听器,但是这个时候不包含第三种。
在这里插入图片描述
在这里插入图片描述

监听器注册演示

@SpringBootApplication
public class Study03Application {

    public static void main(String[] args) {
        try {
            SpringApplication application = new SpringApplicationBuilder(Study03Application.class)
                    .bannerMode(Banner.Mode.OFF)
                    // 指定web应用程序类型,SERVLET,REACTIVE,NONE
                    // NONE  就是表示不对外提供web服务
                    .web(WebApplicationType.SERVLET)
                    .allowCircularReferences(true) // 是否允许循环引用
                    .build();
            // ApplicationListener 分为两种,一种是在spring容器初始化完成之前就需要监听事件的,一种是在spring容器初始化完成之后监听事件的
            // 第一种比如: 应用程序的pid写入文件,当程序启动后spring会发送ApplicationPreparedEvent事件,但是这个时候,spring还没有扫描所有组件进行初始化。
            // 这个时候就无法监听
            //application.addListeners(new ApplicationPidFileWriter());
            application.addListeners(new WebServerPortFileWriter());
            // 第二种是比较常见的,这里就不演示了
            application.run(args);
        } catch (Exception ex){
            ex.printStackTrace();
        }
}

在resources目录下的META-INF/spring.factories中添加下面内容

org.springframework.context.ApplicationListener=org.springframework.boot.context.ApplicationPidFileWriter

启动后会自动生成这两个内容
在这里插入图片描述

ApplicationContext初始化过程中发布的事件

  1. ApplicationStartingEvent是在DefaultBootstrapContextSpringApplicationRunListeners刚初始化完
    在这里插入图片描述

  2. ApplicationEnvironmentPreparedEvent是在环境信息初始化完成
    在这里插入图片描述

  3. ApplicationContextInitializedEvent是在ApplicationContext初始化完成之后

在这里插入图片描述

  1. ApplicationPreparedEvent 在refresh之前,在bean声明被加载之后。
  2. ApplicationStartedEvent 在ac的refresh之后,在ApplicationRunner和CommandRunner之前发布
  3. AvailabilityChangeEvent 在started之后发布
  4. ApplicationReadyEvent 是在ApplicationRunner和CommandRunner之后执行
  5. AvailabilityChangeEvent 是在ready之后执行
  6. ApplicationFailedEvent 是在应用应用程序启动失败时发布
  7. WebServerInitializedEvent 在WebServer准备好后发布
  8. ContextRefreshedEvent 是在AC的refresh执行完成后

基于spring事件驱动机制下,存在多个ApplicationContext的情况下,子AC发送的消息会被传递到父AC中。

在多层级下的ApplicationContext,一个监听器可能收到多个同样的事件,这就是因为事件向父类传递导致的,由此衍伸出,可以通过实现ApplicationContextAwre或者@Autowire 来注入AC进行区分是子类的AC传递过来的还是父AC传递过来的

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

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

相关文章

网课录制新技能,声画同步,三款录屏软件助力教师高效授课

在数字化教育的浪潮中,教师和培训讲师们越来越依赖于录制网课来提升教学效果。无论是PPT课件的深入讲解,Word文档的详细演示,还是操作手册的直观展示,一款出色的录屏软件都能使这一过程更加生动和高效。今天,我将为大家…

【C++/STL】:哈希 -- 线性探测哈希桶

目录 💡前言一,unordered系列容器二,哈希2.1 哈希的概念2.2 哈希函数2.3 哈希冲突 三,哈希冲突解决(重点)3.1 开放定址法3.2 哈希桶(重点) 四,线性探测的实现4.1 线性探测的基本框架4.2 插入操作4.3 查找操作4.4 删除操…

【C++】类和对象——Lesson1

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C 🚀本系列文章为个人学习笔记…

【Golang 面试 - 基础题】每日 5 题(十)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

关联映射和缓存机制学习笔记

学习视频:4001 关联映射概述_哔哩哔哩_bilibili~4007 案例:商品的类别_哔哩哔哩_bilibili 目录 1.关联映射概述 1.1关联映射关系 一对一关系 一对多关系 多对多关系 Java对象如何描述事物之间的关系 1.2一对一查询 元素 a.嵌套查询方式 b.嵌套结果方…

Spring Cache常用注解

依赖代码如下&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency> 常用注解详解 1. Cacheable 作用&#xff1a;主要用于配置方法&#xff0c;使其…

第九届全球渲染大赛来了!CG爱好者准备好了吗!

在CG界的日历上&#xff0c;二月和八月总是特别繁忙的月份。这两个月&#xff0c;全球CG艺术界最盛大的赛事——全球渲染大赛&#xff0c;都会开放报名&#xff0c;吸引着世界各地的CG艺术家和爱好者参与。备受期待的第九届全球渲染大赛&#xff0c;已经定于2024年8月3日在美国…

微信私域运营工具分享

解决微信多管理难的问题&#xff0c;多微信工作重复做&#xff0c;效率低的问题&#xff0c;防止飞单、删除客户&#xff0c;解决私域运营的难题

在双碳目标下,如何实现工厂的数字化改造升级

在"双碳"目标下&#xff0c;如何实现工厂的数字化改造升级 在“双碳”目标&#xff0c;即2030年前实现碳达峰、2060年前实现碳中和的宏伟蓝图下&#xff0c;企业作为经济社会活动的主体&#xff0c;其改造升级不仅是响应国家战略的必然要求&#xff0c;也是实现可持…

软件压力测试知识大揭秘,专业软件测评公司推荐

在信息技术迅猛发展的今天&#xff0c;软件已经成为各个行业运作的核心。有助于提升工作效率和管理水平的&#xff0c;软件的稳定性和性能也变得尤为重要。而软件压力测试&#xff0c;作为一种重要的测试手段&#xff0c;逐渐受到了更多企业的重视。 软件压力测试&#xff0c;…

【ROS 最简单教程 001/300】ROS 概念介绍

ROS&#xff1a;Robot Operating System 【适用于机器人的开源元操作系统】 ROS Plumbing Tools Capabilities Ecosystem 通讯 Plumbing ⭐ 实现ROS不同节点之间的交互工具 Tools ⭐ 工具软件包 (ROS中的开发和调试工具)&#xff0c;提供 仿真 功能&#xff1b;功能 Capabi…

图文好物和无人直播实操:定位/涨粉/养号/橱窗/作品/制作/剪辑/开播/等等

1.前言 各位小伙伴大家好&#xff0c;这里是天夏共创&#xff0c;免费分享副业/创业精品项目资源&#xff0c;打破互联网创业/副业信息壁垒&#xff0c;和您一起共享副业/创业项目资源&#xff0c;开启智能化创业/副业新时代&#xff01;致力于每天免费分享全网互联网精品VIP项…

React类组件生命周期与this关键字

类组件生命周期 参考链接 一图胜千言&#xff08;不常用的生命周期函数已隐藏&#xff09; 代码&#xff1a; //CC1.js import { Component } from "react";export default class CC1 extends Component {constructor(props) {super(props);console.log("con…

基于IDEA+Mysql+SpringBoot开发的社区养老服务管理系统

基于IDEAMysqlSpringBoot开发的社区养老服务管理系统 项目介绍&#x1f481;&#x1f3fb; node -version 14.21.3 在当前社会老龄化趋势日益加剧的背景下&#xff0c;构建一个高效、便捷的社区网养老服务管理系统显得尤为重要。本项目基于Spring Boot框架开发&#xff0c;旨…

网站打不开怎么办,收藏以备不时之需

DNS设置示范教程 部分地区有使用移动网络的小伙伴们吐槽无法访问部分网站的情况&#xff0c;同样的网站&#xff0c;使用电信和联通的用户就能正常访问。 这其实有很大几率是由于运营商的网络问题导致的&#xff0c;容易出现网站打不开的结果。 要解决移动网络无法访问的情况…

【React Hooks原理 - useTransition】

概述 在上一篇中我们介绍了useDeferredValue的基本原理&#xff0c;本文主要介绍一下useTransition这个Hook&#xff0c;之所以在这里提到useDeferredValue&#xff0c;是因为这两个Hook都是在React18引入的进行渲染优化的Hooks&#xff0c;在某些功能上是重叠的&#xff0c;主…

YOLO入门教程(一)——训练自己的模型【含教程源码 + 故障排查】

目录 引言前期准备Step1 打标训练Step2 格式转换Step3 整理训练集Step4 训练数据集4.1创建yaml文件4.2训练4.3故障排查4.3.1OpenCV版本故障&#xff0c;把OpenCV版本升级到4.0以上4.3.2NumPy版本故障&#xff0c;把NumPy降低版本到1.26.44.3.3没有安装ultralytics模块4.3.4Aria…

自闭症儿童上学指南:帮助孩子适应校园生活

在自闭症儿童成长的道路上&#xff0c;校园生活是他们融入社会、学习新知、发展社交技能的重要一步。作为星启帆自闭症儿童康复机构&#xff0c;我们深知这一过程对于孩子及其家庭而言既充满挑战也极具意义。 一、前期准备&#xff1a;建立坚实的支持体系 1. 深入了解孩子需求 …

【机器学习】梯度下降函数如何判断其收敛、学习率的调整以及特征缩放的Z-分数标准化

#引言 在机器学习中&#xff0c;特征缩放和学习率是两个非常重要的概念&#xff0c;它们对模型的性能和训练速度有显著影响。 特征缩放是指将数据集中的特征值缩放到一个固定的范围内&#xff0c;通常是在0到1之间或者标准化到均值为0、方差为1。特征缩放对于模型的训练至关重要…

Vmware安装openstack

安装虚拟机 创建完成后&#xff0c;点击开启虚拟机 稍等执行成功后 上传压缩包到指定目录。将yoga_patch.tar.gz包上传至/root目录下&#xff0c;将stack3_without_data.tar.gz包使用WinSCP上传至/opt目录下 vim run_yoga.sh #/bin/bash cd /root sudo apt-get update tar -xzv…