SpringBoot源码阅读(3)——监听器

ApplicationListener类初始化位置

在类SpringApplication的构造方法,第267行
在这里插入图片描述
META-INFO/spring.factories中配置的实现类
spring-boot

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.ClearCachesApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\
org.springframework.boot.context.config.AnsiOutputApplicationListener,\
org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.context.logging.LoggingApplicationListener,\
org.springframework.boot.env.EnvironmentPostProcessorApplicationListener

spring-boot-autoconfigure

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

相关类

在这里插入图片描述

  • ApplicationEvent 事件祖先类
  • org.springframework.context.event.ApplicationEventMulticaster 事件多播器
  • org.springframework.context.event.SmartApplicationListener 监听器
  • org.springframework.context.event.GenericApplicationListener 监听器
  • org.springframework.context.event.EventListener 监听器

SpringBoot启动过程中的事件,都由org.springframework.context.event.ApplicationEventMulticaster播出去,让监听器处理。

监听器触发逻辑

从加载开始

入口在SpringApplication的构造方法,第267行
类工厂加载ApplicationListener的实现类

setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));

然后在SpringApplication的实例方法run中,第297行,加载SpringApplicationRunListeners类,这个类中持有多播器的引用。

SpringApplicationRunListeners listeners = getRunListeners(args);

SpringApplicationRunListeners实例化的时候,会通过工厂类加载SpringApplicationRunListener

private SpringApplicationRunListeners getRunListeners(String[] args) {Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };return new SpringApplicationRunListeners(logger,getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args),this.applicationStartup);
}

SpringApplicationRunListener的实现类

# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener

EventPublishingRunListener中持有的监听器,就是SpringApplication中加载的ApplicationListener的实现类

public EventPublishingRunListener(SpringApplication application, String[] args) {this.application = application;this.args = args;this.initialMulticaster = new SimpleApplicationEventMulticaster();for (ApplicationListener<?> listener : application.getListeners()) {this.initialMulticaster.addApplicationListener(listener);}
}
  • ClearCachesApplicationListener
  • ParentContextCloserApplicationListener
  • FileEncodingApplicationListener
  • AnsiOutputApplicationListener
  • DelegatingApplicationListener
  • LoggingApplicationListener
  • EnvironmentPostProcessorApplicationListener
  • BackgroundPreinitializer

存储

然后这些监听器被放入了SimpleApplicationEventMulticaster简单多播器里面

@Override
public void addApplicationListener(ApplicationListener<?> listener) {synchronized (this.defaultRetriever) {// Explicitly remove target for a proxy, if registered already,// in order to avoid double invocations of the same listener.Object singletonTarget = AopProxyUtils.getSingletonTarget(listener);if (singletonTarget instanceof ApplicationListener) {this.defaultRetriever.applicationListeners.remove(singletonTarget);}this.defaultRetriever.applicationListeners.add(listener);this.retrieverCache.clear();}
}

默认的defaultRetriever则是一个内部类DefaultListenerRetriever
在这里插入图片描述

触发

会在多个地方触发,比如
SpringApplicationrun方法,第298行

listeners.starting(bootstrapContext, this.mainApplicationClass);

触发过程又涉及到事件的设计

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

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

相关文章

Top级“水刊”!高达10.1分,发文量大,最快1个月左右录用,几乎沾边可录!

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;来稿即录25天&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;纯正刊29天录用&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; 知网 • 7天录用-检索&#xff08;急录友好&…

【YOLOv5进阶】——替换主干网络(backbone)-MobileNet为例

声明:笔记是做项目时根据B站博主视频学习时自己编写,请勿随意转载! 一、说在前面的一些话 1、torchvision 需要用到torchvision里的一些模块,之前第一期配置环境的时候已经安装过torchvision! torchvision是PyTorch生态系统中的一个关键库,专门为计算机视觉任务设计和优…

个性化微课教学视频推荐系统-计算机毕业设计源码77648

个性化微课教学视频推荐系统 摘 要 随着信息技术的迅猛发展&#xff0c;教育领域正经历着前所未有的变革。微课作为一种新兴的教学资源形式&#xff0c;以其短小精悍、针对性强、易于传播等特点&#xff0c;逐渐受到广大师生的青睐。然而&#xff0c;在微课资源日益丰富的今天…

Python语法基础

python语法 TIPS&#xff1a;本文适合有一定编程语言基础的人快速复习python基本语法 python的IO&#xff1a; 基础input ainput()&#xff1a;默认输入 基础output print():默认输出 默认换行参数end""控制字母之间的距离,可以理解为默认为换行符&#xff0c;修改…

谷粒商城学习笔记-逆向工程错误记录

文章目录 1&#xff0c;Since Maven 3.8.1 http repositories are blocked.1.1 在maven的settings.xml文件中&#xff0c;新增如下配置&#xff1a;1.2&#xff0c;执行clean命令刷新maven配置 2&#xff0c;internal java compiler error3&#xff0c;启动逆向工程报错&#x…

【Linux】网络新手村

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 今天&#xff0c;我们就开始学习Linux网络相关的内容。这篇博客作为Linux网络板块的第一篇博客看&#xff0c;我们首先要带着大家明白Linux网络的一些名词的概念&#xff0c;为之后的学习扫清障碍。然后我…

Bootstrap 按钮下拉菜单

Bootstrap 按钮下拉菜单 简介 Bootstrap 是一个流行的前端框架&#xff0c;用于快速开发响应式和移动设备优先的网页。它提供了一套丰富的组件&#xff0c;包括导航、下拉菜单、按钮等&#xff0c;使得开发者能够轻松构建功能丰富且美观的界面。在本文中&#xff0c;我们将重…

新加坡工作和生活指北:餐饮出行篇

文章首发于公众号&#xff1a;Keegan小钢 ​餐饮 前一篇文章 说到&#xff0c;有些房东不允许房客煮饭&#xff0c;那在新加坡都去哪吃饭&#xff1f;有什么吃的呢&#xff1f; 比较便宜的餐饮场所就是小贩中心、咖啡店和冷气食阁&#xff0c;也是大部分人常去的就餐场所。咖…

分布式整合

一、分布式架构介绍 什么是分布式系统 分布式系统指一个硬件或软件组件分布在不同的网络计算机上&#xff0c;彼此之间仅仅通过消息传递进行通信和协调的系统。 通俗的理解&#xff0c;分布式系统就是一个业务拆分成多个子业务&#xff0c;分布在不同的服务器节点&#xff0…

使用Java实现复杂数据结构算法

使用Java实现复杂数据结构算法 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 前言 在软件开发中&#xff0c;复杂数据结构和算法是提升程序效率和性能的重要组成部分。本文将通过Java语言&…

OCR技术主要用于自动化文本数据的录入

OCR是“Optical Character Recognition”的缩写&#xff0c;中文意思是光学字符识别。这是一种技术&#xff0c;允许电子设备如扫描仪或数码相机读取文档中的文本&#xff0c;通过检测和分析文本的暗和亮的模式来识别字符的形状&#xff0c;然后将这些形状转换为可被计算机处理…

ASP.NET Core----基础学习03----开发者异常页面 MVC工作原理及实现

文章目录 1. 开发者异常页面(1)Startup.cs 页面的基础配置(2)自定义显示报错代码的前后XX行 2. MVC 的原理3. MVC 的实现4.默认路由路径5.返回Json字符串 1. 开发者异常页面 (1)Startup.cs 页面的基础配置 namespace ASP.Net_Blank {public class Startup{private readonly IC…

FlowUs息流:提升学术研究效率的协作神器

在学术界&#xff0c;论文撰写和小组协作是日常研究工作的重要组成部分。FlowUs作为一个多功能的协作平台&#xff0c;为大学教授和学生提供了一个无缝的工作环境&#xff0c;使这些任务变得更加顺畅。 FlowUs模板中心 高校学生教师 专用模板免费 &#x1f393; 教授的论文管…

Webpack安装以及快速入门

3 Webpack 1 什么是Webpack https://webpack.js.org/ (官网) webpack 是一个现代 javascript 应用程序的 静态模块打包器 (module bundler) 待会要学的 vue-cli 脚手架环境, 集成了 webpack, 所以才能对各类文件进行打包处理 webpack是一个 静态模块 打包器,可以做以下的这…

Spring Boot (9):AOP实战经验

1 概述 介绍完Spring AOP所具备的功能特性&#xff0c;接下来&#xff0c;看一下再应用程序中使用AOP时应该遵循哪些最佳实践。 2 活用切点表达式 Spring AOP的一大特色在于在开发人员提供了非常灵活的切点机制。Spring在编译期间处理切入点&#xff0c;并尝试进行优化匹配。然…

计算机的错误计算(二十四)

摘要 计算机的错误计算&#xff08;二十一&#xff09;就案例 展示了“两个不相等数相减&#xff0c;差为0”。本节给出新的计算过程&#xff1a;不停增加计算精度直到出现非0结果。这个过程与结果表明&#xff0c;即使是专业数学软件&#xff0c;对这个问题的处理&#xff0…

1 HTML and CSS

HTMl(超文本标记语言) HTML 概述 超文本标记语言用来描述和定义网页的内容 HTML(超文本标记语言——HyperText Markup Language)是构成 Web 世界的一砖一瓦;它定义了网页内容的含义和结构 “超文本”(hypertext)是指连接单个网站内或多个网站间的网页的链接 1. HTML标签功能区分…

Qt之多线程编程(QThread)

文章目录 前言Qt多线程的基本使用如何移动线程常用的一些函数示例代码总结 前言 在现代计算机系统中&#xff0c;多线程编程已经成为一种常见的编程模式&#xff0c;它可以有效地利用多核处理器的计算能力&#xff0c;提高程序的执行效率。Qt作为一种跨平台的应用程序开发框架…

【ffmpeg系列一】源码构建,ubuntu22与win10下的过程对比。

文章目录 背景ubuntu22结论 win10过程 对比结论 背景 顺手编译个ffmpeg试试&#xff0c;看看不同平台下谁的配置比较繁琐。 先让gpt给出个教程&#xff1a; ubuntu22 使用elementary-os7.1构建&#xff0c;看看有几个坑要踩。 错误1&#xff1a; 依赖libavresample-dev未…