spring源码分析-ApplicationContext----扩展组件event listener

news2024/10/7 16:16:16

        我们知道 spring中的ApplicationContext在beanFactory(提供基础bean处理)基础上增加了扩展组件,例如国际化,资源,发布事件和监听事件,今天主要针对发布和监听事件做一次源码分析,看到底发布和监听是如何实现的?是否放队列消费 还是直接调用?

        核心代码如下

SimpleApplicationEventMulticaster中的multicastEvent方法 广播事件,从对应监听器set集合中遍历,取出对应监听器并直接调用监听器中的方法,整个大的过程包括

1.先实例化监听器并放到set集合中,

2.将发布事件存入到set集合中,

3.在spring调用refresh方法之后进行调用广播事件方法,其实是直接调用的监听器中的对应方法。

AbstractApplicationContext的注册监听器方法 将标注为@EventListener的类添加到set集合中。

调用步骤在spring加载bean的refresh方法之后,如下图

 

         可以看到循环是从getApplicationListeners()方法中获取的set集合,那这个集合又是哪里存的呢?点开getApplicationListeners()方法后的set集合 继续点击发现是如下方法存的值

 而这个方法又是在如下步骤被调用的,从refresh之后调用监听可以得知 这个set过程一定是在此之前的,可以详细看下这里的入口又是哪里。

这个方法在一开始先查找需要进行AOP处理的类名称和类类型,且类类型是实现了EventListener的。

之后拿到这些标注了EventListener注解的类进行调用以上处理监听具体内容的方法。这里重点要看

AnnotatedElementUtils.findMergedAnnotation(method, EventListener.class));

这个方法 是查询方法上标注了注解为EventListener.class的类,找到了注解所标注的类,就可以知道哪些监听器需要处理,然后调用监听器处理方法时,只需要将set集合中保存的事件内容传递即可(监听方法入参)。

是实例化的时候调用的 那么这类的实例化又是哪里调用的?请看bean加载的生命周期,如下

a、创建一个beanDefinitionNames的副本,用于后面循环初始化bean对象;

b、循环前一步骤的beanNames副本,挨个触发非懒加载、单例bean的初始化;

c、首先初始化的前提是bean不是抽象类、非懒加载的、并且是单例的;接着会判断bean是否实现了FactoryBean接口,如果bean实现了FactoryBean接口,那么通过getBean(&beanName)获取的是FactoryBean对象本身。再然后判断bean是否急切需要初始化,如果需要急切初始化,则会直接调用getBean方法初始化;

d、如果没有实现FactoryBean接口的bean,则执行普通的getBean逻辑;

e、最后,如果bean实例singletonInstance实现了SmartInitializingSingleton接口,则执行后初始化回调方法afterSingletonsInstantiated();

重点在最后的bean实例执行完初始化(变量赋值完成)之后进行回调。这里要注意是所有的加载到spring容器中的bean都会调用 不过上面的分析中会查看哪个类的方法包含EventListener注解,所以相当于执行回调的过程中检查了对应注解 进行处理。

整体流程就是如此

主要分为两块

1.在类初始化完成后回调过程中 去发现方法中标注了EventListener注解的类,找到之后放到set集合中。

2.在refresh方法调用完之后调用监听器的处理时,从刚才的set集合中取出监听器进行处理,处理过程中当然也需要拿出event进行传递,event对象在发布事件的时候已经存到一个set集合中。

分析的略有些杂乱,但是顺着代码看就会感觉很简单,大家批评指教!

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

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

相关文章

Promise的常见面试题

四、相关面试题 1. 多个 .catch var p new Promise((resolve, reject) > {reject(Error(The Fails!)) })p.catch(error > console.log(error.message)) p.catch(error > console.log(error.message))以上代码的输出将会是什么? 打印两次 The Fails! 解析…

纯粹数学作业

1、列举一个真命题、一个假命题、一个不知道真假的命题、一个不是命题的陈述。 真命题:太阳是发光发热的。 同位角相等,两直线平行。 假命题:三角形的三个内角和不是180 不知真假的命题:树叶是黄色的。 不是命题的陈述&#x…

伦敦银实时行情软件日常使用

目前伦敦金市场上很多交易都是通过MT4平台来完成,这个行情软件的优势,除了操作简洁、分析功能全面和交易稳定外,支持不同的手机和电子设备版本也是很重要的一点。但很多用户,特别是对于新手日常在操作的过程中,都会或多…

jdk1.8官网下载

地址: https://www.oracle.com/java/technologies/downloads/#java8 选linux x86位的:

【C语言】从水仙花构建思维

前言 🎈大家好,我是何小侠🎈 🍃大家可以叫我 小何或者小侠 🍃 💐希望能通过写博客加深自己对于学习内容的理解💐 🌸也能帮助更多人理解和学习🌸 击石乃有火,…

【反图+拓扑排序】ABC245 F

F - Endless Walk (atcoder.jp) 题意: 思路: 首先,我们什么时候需要建反图:在一个有向图中,我们需要找出可以到达指定的结点的结点时,我们可以建立反图 这道题中,我们需要找出所有能够到达环…

剑指offer刷题笔记--Num31-40

1--栈的压入、弹出序列(31) 直观思路:用两个指针 i 和 j 指向压入和弹出的 vector,终止条件是:所有元素都压入了辅助栈(i > len),且辅助栈当前的栈顶元素与弹出的元素 popped[j] …

Maven Snapshot 更新策略配置方法

项目场景: 提示:这里简述项目相关背景: 在微服务的项目开发中,特别是更新比较频繁的项目,经常会遇到一些项目依赖的问题,依赖的一个项目经常更新,所以我下拉更新项目时候经常出现代码不一致&a…

Ansys Zemax | 使用软件建立立方体卫星系统(一)

在航空航天工业领域中,立方体卫星(CubeSats)已然是一种低成本、易制造的航天光学系统的解决方案。通过制造一组更小、更实惠的系统,使得为航天产品开发生产线方法成为可能。 立方体卫星光学系统的制造商们需要一个准确并可靠的方法…

基于微信小程序学校部门年终绩效考核自动评分系统(源码+文档+数据库+PPT)

基于微信小程序的部门年终绩效考核系统,为加强学校运营队伍建设提高学校管理力,合理评价教师及部门年度工作计划完成情况,促进整体绩效改进,鼓励管理团队注重对下属进行帮助、提升,促进团队扩张和发展,特制…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册10

随着科技的不断进步,机器人技术已经成为了一个重要的领域。在这个领域中,机械结构是机器人设计中至关重要的一部分,它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说,了解机械结构的基础知识,掌…

idea篇2:常用插件

1、汉化插件 下载完成后点击Restart IDE 如果你这边插件搜不出来,还可以去官网插件地址下载 打开 https://plugins.jetbrains.com/ 然后点击Instatll To IDE 弹出Success的时候我们切换回IDEA,然后点击ok 如果你这种方式还是无法成功 那么还可以点击插件商城的Ve…

半年面试数百场,我总结出了这份 10w 字 Java 面试复盘笔记

Java 面试 Java 作为编程语言中的 NO.1,选择入行做 IT 做编程开发的人,基本都把它作为首选语言,进大厂拿高薪也是大多数小伙伴们的梦想。以前 Java 岗位人才的空缺,而需求量又大,所以这种人才供不应求的现状,就是 Java 工程师的薪…

【javascript】导航栏

要实现这样的效果主要有两点。第一&#xff0c;当鼠标经过主导航栏里面的内容就会被放大&#xff0c;鼠标离开后就会恢复原来的样子&#xff1b;第二&#xff0c;当鼠标经过主导航时对应的副导航的内容就会呈现。 <!DOCTYPE html> <html lang"en"> <…

Flink写入数据到ClickHouse

文章目录 1.ClickHouse建表1.ClickHouse依赖2.Bean实体类3.ClickHouse业务写入逻辑4.测试写入类5.发送数据 1.ClickHouse建表 ClickHouse中建表 CREATE TABLE default.test_write (id UInt16,name String,age UInt16 ) ENGINE TinyLog();1.ClickHouse依赖 Flink开发相关…

爬虫入门指南(7):使用Selenium和BeautifulSoup爬取豆瓣电影Top250实例讲解【爬虫小白必看】

文章目录 介绍技术要点SeleniumBeautifulSoupOpenpyxl 实现步骤&#xff1a;导入所需库设置网页URL和驱动路径创建 ChromeDriver 服务配置 ChromeDriver创建 Excel 文件爬取数据关闭浏览器保存 Excel 文件 完整代码导出的excel 效果图未完待续.... 介绍 在本篇博客中&#xff…

Day976.如何安全、快速地接入OAuth 2.0? -OAuth 2.0

如何安全、快速地接入OAuth 2.0&#xff1f; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何安全、快速地接入OAuth 2.0&#xff1f;的内容。 授权服务将 OAuth 2.0 的复杂性都揽在了自己身上&#xff0c;这也是授权服务为什么是 OAuth 2.0 体系的核心的原因之…

企业为什么纷纷推崇数字化管理?

企业提倡或推崇数字化管理&#xff0c;通常是因为几个原因&#xff1a; 效率和生产力&#xff1a;数字管理系统简化流程并自动执行重复任务&#xff0c;从而提高效率和生产力。数字工具可以更快地输入、检索和分析数据&#xff0c;减少人工工作和人为错误。这种效率使企业能够在…

STM32速成笔记—Flash闪存

文章目录 一、Flash简介二、STM32F1的Flash三、Flash操作步骤四、程序设计4.1 读取数据4.2 写入数据&#xff08;不检查&#xff09;4.3 写入数据&#xff08;检查&#xff09; 五、注意事项 一、Flash简介 快闪存储器&#xff08;flash memory&#xff09;&#xff0c;是一种…

物理与IP环境的重要性:打造稳定可靠的亚马逊测评环境

在亚马逊平台上进行测评补单、撸卡和撸货等活动&#xff0c;首要问题是确保环境的安全性和稳定性。一个稳定的环境是进行测评和撸卡的基础&#xff0c;如果无法解决安全性问题&#xff0c;那么从事这些项目就不值得。在环境技术研发领域已经有六七年的经验&#xff0c;在早期测…