10.spring源码之registerListeners()

news2024/10/7 8:30:38

1. 准备

  1. ApplicationEvent: 事件对象,Spring事件驱动模型中的对象源,继承JDK EventObject,通过在发布事件时通过EventObject.source字段携带事件相关的数据。

  2. ApplicationListener: 应用监听器,负责监听事件对象是否有发生变化,实现该接口并实现onApplicationEvent方法,完成事件发生变化时的逻辑处理

  3. ApplicationEventPublisher,事件发布器,定义了事件发布规范,只是接口,具体的实现交给

    实现类。

  4. ApplicationEventMulticaster,负责管理监听器,提供了增删监听者的方法。AbstractApplicationEventMulticaster类扩展了获取监听者的方法。

2. 源码

protected void registerListeners() {
		// Register statically specified listeners first.
        //  首先获取AbstractApplicationContext#applicationListeners属性集合,有的话就添加进去。 核心主要是prepareRefresh() 中earlyApplicationListeners是否为空
		//此处获取的是abstractApplicationContext集合中的,添加到多播器中
       //备注1
		for (ApplicationListener<?> listener : getApplicationListeners()) {
			getApplicationEventMulticaster().addApplicationListener(listener);
		}

		// Do not initialize FactoryBeans here: We need to leave all regular beans
		// uninitialized to let post-processors apply to them!
		// 从容器中获取所有实现了ApplicationListener接口的bd的bdName
		// 放入ApplicationListenerBeans集合中。我猜测是注解扫描到的,我们自定义的。
		String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
		for (String listenerBeanName : listenerBeanNames) {
			getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
//可以改写为:	getApplicationEventMulticaster().addApplicationListener(this.getBean(listenerBeanName,ApplicationListener.class));
		}

		// Publish early application events now that we finally have a multicaster...
		// 已经初始化过一个多播器了,此处先发布早期的事件(如果有的话), prepare时候添加的
		Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
		this.earlyApplicationEvents = null;
		if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
			for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
				getApplicationEventMulticaster().multicastEvent(earlyEvent);
			}
		}
	}

备注1: 如在springboot中,run() ->prepareContext(…)->applyInitializers(context)-> initialize(…) // 会有一些 addApplicationListener 操作,赋值给applicationListeners ,此处就不是空了。
在这里插入图片描述

3. 思考

3.1 逻辑执行过程

  1. 事件源发布不通的事件
  2. 当发布事件之后会调用多播器的方法进行事件的广播操作,由多播器去触发具体监听器去执行操作
  3. 当监听器接收到具体事件后,可以匹配验证是否处理当前事件。

3.2 代码处理过程

  1. 提起准备好多个事件

  2. 初始化多播器,多播器含有一个监听器的集合

    initApplicationEventMulticaster();
    
  3. 准备好一系列的监听器

  4. 向多播器中注册进去已有的监听器

    registerListeners()
    
  5. 准备事件发布,通知多播器循环调用监听器进行相关逻辑处理工作

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

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

相关文章

学习Java8 Stream流,让我们更加便捷的操纵集合

1. 概述 本篇文章会简略的介绍一下 Lambda 表达式&#xff0c;然后开启我们的正题 Java8 Stream 流&#xff0c;希望观众老爷们多多支持&#xff0c;并在评论区批评指正! Java8 的 Stream 流使用的是函数式编程模式。它可以被用来对集合或数组进行链状流式的操作&#xff0c;…

推荐系统基本问题及系统优化路径

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年10月份热门报告盘点大规模推荐类深度学习系统的设计实践.pdf荣耀推荐算法架构演进实践.pdf推荐系统在腾讯游戏中的应用实践.pdf清华大学256页PPT元宇宙研究报告.pdf&…

产品设计杂感

概述 前面多篇文章提过我近一年以来几乎是一个人在负责一款数据产品&#xff0c;一款公司内部使用的报表开发工具。市面上的类似产品如Tableau&#xff0c;QuickBI等。工作角色&#xff08;职责&#xff09;包括&#xff1a;后端开发&#xff0c;前端开发&#xff0c;功能测试…

STM32 bootloader简单实现的验证

目录 背景知识 STM32的启动模式 Flash memory的大小 实验验证 分区分配 bootloader代码 systeminit 背景知识 STM32的启动模式 STM32有三种启动模式, 这里验证的bootloader是通过Flash memory启动方式, 使用STM32内置的Flash,其首地址是0x08000000&#xff0c;一般我们…

[论文阅读] 颜色迁移-梯度保护颜色迁移

[论文阅读] 颜色迁移-梯度保护颜色迁移 文章: [Gradient-Preserving Color Transfer], [代码未公开] 本文目的: 如题所示为梯度保护的颜色迁移方法. 1-算法原理 人类的视觉系统对局部强度差异比强度本身更敏感, 因而, 保持颜色梯度是场景保真度的必要条件, 因而作者认为: 一…

python+django留守儿童爱心捐赠网站

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究…

城市应急处置系统实施目标

针对需求分析中的业务目标&#xff0c;本系统在实施中&#xff0c;通过 “两个工作台七个子系统”的目标来支撑业务目标&#xff0c;满足系统延续需求、功能需求、制度建设需求、平台拓展需求和技术性能需求。 具体分为事前6个子系统、事中2个工作台和事后1个子系统这三方面目标…

002:UIView

UIView简介&#xff1a; UIView作为最基础的视图类&#xff0c;起着管理屏幕上一定区域内容展示的作用。作为各种视图的父类&#xff0c;提供相应的基础能力。 外观、渲染和动画。相应区域内的事件。布局和管理子视图。 布局&#xff1a; 设置自身大小&#xff08;size&…

[附源码]Python计算机毕业设计SSM基于农产品交易系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

动态代理:JDK动态代理源码学习

文章目录前言概述什么是代理静态代理动态代理正文入口方法1&#xff1a;newProxyInstance方法2&#xff1a;getProxyClass0方法3&#xff1a;get 获取代理方法4&#xff1a;apply 创建代理方法5&#xff1a;generateProxyClass方法6&#xff1a;generateClassFile代理类总结前言…

LeetCode_动态规划_困难_1691.堆叠长方体的最大高度

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 给你 n 个长方体 cuboids &#xff0c;其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti]&#xff08;下标从 0 开始&#xff09;。请你从 cuboids 选出一个子集 &#xff0c;并将它们堆…

ubuntu14.04搭建openGrok 1.7.40 + Java17+tomcat10.0.27阅读android系统代码

为了快速阅读android系统代码&#xff0c;首选openGrok&#xff0c;其它SI或understand估计不适合了。 话不多说&#xff0c;工欲善其事必先利其器&#xff0c;先下载源码和工具. 以下命令默认使用root&#xff0c;防止权限问题 一、下载android 代码 还是清华的镜像比较牛…

农村金融专题-保险支出、收入、补贴各省份涉农贷款数据集

一、31省市农业保险赔付支出 1、数据来源&#xff1a;wind数据库 2、时间跨度&#xff1a;2005-2019年 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; 部分数据如下&#xff1a; 二、各省农业保险保费收入 1、数据来源&#xff1a; 中国保险数据 2、时间跨度&…

「杂谈·II」cmp() 的参数类型应该是啥?

0. 引言 上了一节 DS 课&#xff0c;但是回到了初学 C 的内容…… 众所周知&#xff0c;最小生成树的 Kruskal 要用边表排序&#xff0c;通常是 sort() 配 cmp()。 而 cmp() 的两个参数的类型最好是什么呢&#xff1f; 让我们回到初学 C 的时候&#xff0c;温习一下知识…… 1…

MySQL数据库学习(3)

MySQL中select语句语法简单介绍&#xff1a; 基本语法规则&#xff1a; SELECT {* | <字段列名>} [FROM <表 1>, <表 2>… [WHERE <表达式> [GROUP BY <group by definition> [HAVING <expression> [{<operator> <expression>…

FineReport商业智能数据分析-下拉框控件

1. 概述 1.2 应用场景 「下拉框控件」可应用于填报、参数等场景&#xff0c;本文将介绍「下拉框控件」的属性及应用。 1.2.1 填报控件 填报报表中&#xff0c;可以用来在多个预备选项中选择一个值填入。如下图所示&#xff1a; 1.2.2 参数控件 参数面板处可以通过该控件过…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.4 流控效果【warm up】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.4 流控效果【warm up】31.4.1 流控效果31.4.2 流控效果 - warm up31.4.3 案例31 限…

[论文阅读] 颜色迁移-Illuminant Aware Gamut-Based

[论文阅读] 颜色迁移-Illuminant Aware Gamut-Based 文章: [Illuminant Aware Gamut-Based Color Transfer], [python代码] 本文目的是提出一种新的颜色迁移算法, 可以感知光源变化的全色域颜色迁移方法. 1-算法原理 图像是由摄像机对光谱场景内容和场景照度的敏感性所产生…

springboot validated注解数据校验 异常处理

springboot validated 数据校验validated 数据校验简单的写一下这个用法啊&#xff0c;清晰的本篇文章就记录这个注解的一个用法。validated 数据校验 我们一般的数据校验是怎么用的&#xff1f;在常规模式下我们可能就是在前端去通过js去判断&#xff1f;还是在后端重新查找数…

【C语言字符串相关函数大全】

【C语言字符串相关函数大全】【1】atof【2】atoi【3】atol【4】isalnum【5】isdigit【6】islower【7】isupper【8】isprint【9】memchr【10】memcmp【11】memcpy【12】memset【13】strcat【14】strchr【15】strcmp【16】strpbrk【17】strstr【18】strtok【19】源码【20】源码执…