(四)springboot实战——springboot的事件与监听器原理

news2024/11/27 9:58:25

前言

本节内容是关于springboot的一些核心原理的总结,包括springboot的事件原理、生命周期流程、事件触发流程等核心内容的介绍,从而帮助我们更好的理解与使用springboot,这里只做概念性的内容总结,实战的部分请关注作者后续博客内容。

正文

  • 监听springboot应用生命周期的监听器SpringApplicationRunListener

- 自定义SpringApplicationRunListener监听器来监听springboot应用事件

package com.yundi.isbc.listen;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

import java.time.Duration;


public class MySpringApplicationRunListener implements SpringApplicationRunListener {
    @Override
    public void starting(ConfigurableBootstrapContext bootstrapContext) {
        System.out.println("==========================容器正在启动==========================");
    }

    @Override
    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
        System.out.println("==========================容器环境准备完成==========================");
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("==========================容器准备完成==========================");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("==========================容器加载==========================");
    }

    @Override
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("==========================容器开启==========================");
    }

    @Override
    public void ready(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("==========================容器准备就绪==========================");
    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.out.println("==========================容器启动失败==========================");
    }
}

 - 在META-INF/spring.factories中配置自定义的监听器MySpringApplicationRunListener

 

- 启动springboot项目,查看打印日志,确认springboot的启动生命周期流程

- spring的生命周期说明:springboot启动主要分为三大步:引导、启动、运行

  1.  引导:利用 BootstrapContext 引导整个项目启动,starting阶段是SpringApplication的run方法执行的开始阶段,environmentPrepared阶段主要是把启动参数绑定到环境变量中,此时IOC容器还没有创建。
  2. 启动:contextPrepared阶段ioc容器完成创建并准备好,但是sources(主配置类)资源还没有加载,同时关闭引导上下文 BootstrapContext ,此时Bean组件还没有创建;contextLoaded阶段ioc容器加载完成,主配置类加载到了IOC容器,但是ioc容器还没有刷新,程序Bean还没有加载;started阶段ioc容器刷新了(所有bean完成注入),但是 runner还没调用;ready阶段ioc容器刷新了(所有bean完成注入),所有 runner 也都调用完成了。
  3. 运行:此时app应用完成加载,应用可以实现访问处理。
  • springboot的回调监听器 

- BootstrapRegistryInitializer:感知特定阶段:感知引导初始化

- ApplicationContextInitializer:感知特定阶段: 感知ioc容器初始化,在META-INF/spring.factories下配置。

- ApplicationListener:感知全阶段:基于事件机制,感知事件,在META-INF/spring.factories下配置

- SpringApplicationRunListener:感知全阶段生命周期 + 各种阶段都能自定义操作,在META-INF/spring.factories下配置

- ApplicationRunner:感知特定阶段:感知应用就绪Ready。

- CommandLineRunner:感知特定阶段:感知应用就绪Ready。

  •  springboot的回调监听器的最佳实践

- 项目启动前:使用BootstrapRegistryInitializer ApplicationContextInitializer

- 项目启动完成:使用ApplicationRunnerCommandLineRunner

- 在springboot的生命周期任意阶段:使用SpringApplicationRunListener

- 事件驱动:使用ApplicationListener

  •  springboot的事件感知

- 实现自定义的ApplicationListener监听器

package com.yundi.isbc.listen;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("--------------------------事件感知-----------------------"+event);
    }
}

 - 在META-INF/spring.factories中配置自定义的ApplicationListener监听器

- 启动应用程序,查看springboot的事件触发顺序&时机

  • springboot的9大事件触发顺序&时机

- ApplicationStartingEvent:应用启动但未做任何事情, 除过注册listeners and initializers


- ApplicationEnvironmentPreparedEvent:  Environment 准备好,但context 未创建 


- ApplicationContextInitializedEvent: ApplicationContext 准备好,ApplicationContextInitializers 调用,但是任何bean未加载


- ApplicationPreparedEvent: 容器刷新之前,bean定义信息加载


- ApplicationStartedEvent: 容器刷新完成, runner未调用


- AvailabilityChangeEvent:LivenessState.CORRECT应用存活; 存活探针


- ApplicationReadyEvent: 任何runner被调用 


- AvailabilityChangeEvent:ReadinessState.ACCEPTING_TRAFFIC就绪探针,可以接请求


- ApplicationFailedEvent :启动出错

结语

关于springboot的事件与监听器原理等相关内容到这里就结束了,我们下期见。。。。。。

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

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

相关文章

数学建模-分类模型 Fisher线性判别分析

论文中1. 判别分析系数 2. 分类结果 多分类问题 勾选内容和上面一样

06微分方程模型练习

用Matlab求解微分方程 y ′ − 2 y 2 x 2 2 x , y ( 0 ) 1 y-2y2x^{2}2x,y\left( 0\right) 1 y′−2y2x22x,y(0)1 y1 dsolve(Dy-2*y2*x.^22*x) y2 dsolve(Dy-2*y2*x.^22*x,y(0)1,x)用Matlab分别求解微分方程 y ′ − 2 y 2 x 2 2 x , y ( 0 ) 1 y-2y2x^{2}2x,y\left…

C语言动态内存管理(二)经典笔试题

第二篇内容为大家详细剖析关于动态内存管理的几个经典笔试题 目录 四、笔试题1.请问运行Test函数会有什么样的结果&#xff1f;结果&#xff1a;结果运行出错的原因&#xff1a;本题目注意点&#xff1a;改正该题目的错误&#xff1a;正确修改1&#xff1a;&#xff08;利用传值…

Electron入门学习_使用预加载脚本

学习网址&#xff1a; https://www.electronjs.org/zh/docs/latest/tutorial/tutorial-preload 1.什么是预加载脚本 Electorn 的主进程是一个拥有完全操作系统访问权限的Node.js ,除了Electron 模组&#xff0c;之外&#xff0c;您也可以访问Node.js 内置模块和所有通过npm安装…

质效两全:媒体服务的创新“顶设”

做媒体服务&#xff0c;一定要有刻入骨髓的抽象思维。 视频化浪潮汹涌、生成式人工智能AIGC极速迭代、体验需求和应用场景愈发多样......面对“视频生产力”的变革&#xff0c;我们能否透过纷繁复杂的表象&#xff0c;洞察音视频行业的“真正需求”&#xff1f; 是否存在一套…

【mysql数据库】MySQL7在Centos7的环境安装

说明&#xff1a; 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c;⼀旦安装&#xff0c;普通用户就能使用。初期练习&#xff0c;mysql不进行用户管理&#xff0c;全部使⽤root进⾏&#xff0c;尽快适应mysql语句&#xff0c;后⾯学了用户管理&#xff0c;在考虑新…

matlab dot()函数求矩阵内积,三维 ,多维 详解

matlab dot()函数求矩阵内积&#xff0c;三维 &#xff0c;多维 详解 Cdot(A,b,X)&#xff0c;这个参数X 只能取1,或者2。1 表示按列&#xff0c;2表示按行&#xff0c;如果没有参数。默认按列。 1&#xff09;按列优先计算 Cdot(A,B)dot(A,B,1)[a1*b1a4*b4 ,a2*b2a5*b5 ,a…

html,css初学

安装VSCODE ,插件&#xff1a;live server &#xff0c;html support html 然后为了更好地理解&#xff0c;请逐步输入&#xff0c;并及时查看效果 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>D…

A--自动收小麦机--2023河南萌新联赛第(二)场:河南工业大学

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 示例1 输入 4 1 2 1 1 4 5 2 2 2 3 4 输出 10 说明 在第4格放出水流后&#xff0c;水流会流向第3格&#xff0c;由于第3格高度比第4格低&#xff0c;所以水流继续向左流向第2格&#xff0…

爬虫的编解码方式

get请求的quote方法 我们在对爬取一个网页的时候&#xff0c;我们复制了这个网页的地址&#xff0c;但我们发现在将他粘贴下来以后不会是汉字&#xff0c;而是一串字符&#xff0c;这时候&#xff0c;我们需要去对字符进行编码&#xff0c;以便于我们能够继续去爬取网页。 例…

markdown编写数学公式

在计算机这一块&#xff0c;我们肯定会接触到数学&#xff0c;数学中又包含很多公式&#xff0c;但是到现在&#xff0c;手写这些公式应该不陌生&#xff0c;但是如果让你电脑敲出来&#xff0c;你绝对很懵逼&#xff0c;这也造成了我们有时候写笔记时一些公式没办法在电脑上像…

ffmpeg离线安装ffmpeg-4.1.4-amd64-static.tar.xz

1.下载离线包 John Van Sickle - FFmpeg Static Builds 找历史版本&#xff1a;Index of /ffmpeg/old-releases 我选择是的4.1.4版本 2.解压 tar -xvJf ffmpeg-4.1.4-amd64-static.tar.xz 3.移动文件到opt目录下 4.添加全局链接 ln -s /opt/ffmpeg-4.1.4-amd64-static/ffm…

【C++基础(五)】类和对象(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 类和对象-上 1. 前言2. 类的引入3. 类的定义4. 类的…

代码随想录-回溯(组合问题)|ACM模式

目录 前言&#xff1a; 77.组合 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 216. 组合总和 III 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 17. 电话号码的字母组合 题目描述&#xff1a; 输入输出描述&a…

MODBUS TCP转CCLINK IE协议网关profinet接口和以太网接口的区别

你是否曾经遇到过需要将不同的设备连接到一个统一的网络中&#xff1f;或者你是否曾经遇到过设备之间的通讯协议不兼容的问题&#xff1f;远创智控的YC-CCLKIE-TCP通讯网关就是为解决这些问题而设计的。 YC-CCLKIE-TCP通讯网关是一款自主研发的CCLINK IE FIELD BASIC从站功能…

OpenAI报错 time out:HTTPSConnectionPool(host=‘api.openai.com‘, port=443)

项目场景&#xff1a; 使用openai的api调用chatGPT报错&#xff0c;同样的代码在另一台机器没有问题 问题描述 使用官方示例 import openaiopenai.api_key sk-xxxx def chat_gpt(prompt):prompt promptmodel_engine "text-davinci-003"completion openai.Comp…

【Default config not found for ApplicationConfig】的一种解决方案

&#x1f4a7; 记录一下今天遇到的 b u g \color{#FF1493}{记录一下今天遇到的bug} 记录一下今天遇到的bug&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算…

vue项目之《 搭建路由系统 》

author&#xff1a;德玛玩前端 date&#xff1a;2023-07-22 今天&#xff0c;在工作中拿到了架构师的前端框架&#xff0c;是一个vue2elementui搭建的单页面架构&#xff0c;没有路由系统&#xff0c;需要自己搭建&#xff0c;因为以往拿到的框架都是路由系统已经搭建好&#x…

数据结构初阶--单链表

目录 一.单链表的定义 二.单链表的分类 2.1.不带头结点的单链表 2.2.带头结点的单链表 三.单链表的功能实现 3.1.单链表的定义 3.2.单链表的打印 3.3.单链表的结点的创建 3.4.单链表的尾插 3.5.单链表的头插 3.6.单链表的尾删 3.7.单链表的头删 3.8.单链表的查找 …

【Vue3】Vue3核心内容(上)

&#x1f380;个人主页&#xff1a;努力学习前端知识的小羊 感谢你们的支持&#xff1a;收藏&#x1f384; 点赞&#x1f36c; 加关注&#x1fa90; 文章目录 常用的Composition APIsetup函数ref函数reactive函数vue3中的响应式原理vue2的响应式Vue3的响应式 reactive对比Refse…