spring中事件发布设计与实现
spring中的事件发布框架依赖于三个抽象,ApplicationEvent,ApplicationListener,ApplicationEventPublisher。ApplicationEventPublisher的实现类依赖于AbstractApplicationContext,当中又依赖于ApplicationEventMulticast,其发布事件依赖于是否有设置事件监听器执行器,如果有设置,执行事件监听器就异步的,否则就是同步的。
1、接口设计
2、启动
(1)在调用invokeBeanFactoryPostProcessors时,EventListenerMethodProcessor会获取容器中所有的EventListenerFactory类。
(2)在initApplicationEventMulticaster中初始化SimpleApplicationEventMulticaster。
(3)在registerListeners中,向eventMulticaster中添加静态指定的监听器,以及添加容器中类型为ApplicationListenere的实例,同时如果有需要早期发布的事件,则会发布事件。
(4)在finishBeanFactoryInitialization中,非懒初始化容器中的对象实例时,如果实例类型是SmartInitializingSingleton,比如EventListenerMethodProcessor,会提取有@EventListenere的方法,作为监听器添加到eventMulticaster中
(5)在finishRefresh中,会发布ContextRefreshEvent事件
3、发布事件
(1)发布事件时,会获取当前的 taskExecutor。
(2)获取对应事件及事件类型的Listeners
(3)如果设置了taskExecutor,则异步执行invokeListener,会触发事件监听器的执行。如果出现异常,则执行ErrorHandler。
(4)没有设置taskExecutor,则同步执行invokeListener,触发事件监听器的执行,异常时执行ErrorHandler.
spring中事件发布设计与实现相关推荐
- Spring的事件发布机制
一:Spring的事件发布 ApplicationContext提供了针对Bean的事件传播功能,其中的主角是publishEvent()方法,通过这个方法可以将事件通知给系统内的监听器(需实现App ...
- 如何实现业务解耦?spring中事件监听了解一下
一.前言 二.业务解耦之事件监听实战 1.事件监听三大组件 2.事件发布以及监听实战案例 3.事件发布以及监听原理 一.前言 耦合这个词在平常的开发 ...
- Spring Event事件发布机制
使用Spring Event优雅实现业务需求. 文章目录 一. 什么是Spring Event 二. 为什么要用Spring Event 三. 使用Spring Event实现邮件发送 一. 什么是S ...
- spring中事务的设计和实现
1.事务中的抽象设计 主要由TransactionMangager,TransactionDefinition,TransactionStatus和TransactionAttributeSource ...
- spring中expression框架设计与实现
1.接口设计 主要由ExpressionParser,ParserContext,Expression,EvaluationContex以及EvaluationContex相关组件(OperatorO ...
- spring中type转换框架设计与实现
1.概略图 2.接口设计 主要包含Converter及Formatter ConverterRegistry主要是添加.删除Converter以及ConverterFactory. Conversio ...
- spring中AnnotationUtils的设计
其相关类层次图
- Spring事件发布机制
目录 前言 一.事件驱动机制 二.Spring的事件发布机制 三.Spring事件使用实例 四.Spring事件驱动的实现原理 总结: 前言 在设计模式中有一种设计模式叫做观察者设计模式,观察者模式的 ...
- Spring Boot使用ApplicationEvent来实现事件发布订阅功能(美女一个都不能少,都要通知到) - 第420篇
历史文章(累计400+篇文章) <国内最全的Spring Boot系列之一> <国内最全的Spring Boot系列之二> <国内最全的Spring Boot系列之三&g ...
最新文章
- java笔试题(3)
- 微信小程序从oracle取数,微信小程序 取随机数
- Hibernate中Session的清理与清空
- git 删除已经 add 的文件 记录
- replace和replaceAll
- 单词查找树(信息学奥赛一本通-T1337)
- 手写数字阅读器用户界面
- java ftp 大文件_用Java实现FTP批量大文件上传下载(二)
- sql server死锁_如何报告SQL Server死锁事件
- CCF NOI1034 钞票兑换
- [C#]WPF 3D 绘制一个正方体并调整视场角
- 江苏省2021年高考成绩查询有分数吗,江苏省2021年普通高考录取分数线公布
- Inception模块 GooLeNet网络
- 天行健,君子以自强不息
- LATEX 幻灯片入门
- 微信开通检测平台应如何选择?
- vue 样式标签使用 scoped
- 计算机课教学日志,教师教学日志例文
- python写的平行四边形_python 已知平行四边形三个点,求第四个点的案例
- fastjson 序列化 不包括转义字符_fastjson黑盒测试与白盒审计
热门文章
- Servlet开发配置
- UICollectionView 简单使用
- 水晶报表主子报表分页问题
- sqlServer事务
- python语言程序设计基础第二版答案-python语言程序设计基础(第二版)第五章答案随笔...
- 给python初学者的最好练手项目-Python的练手项目有哪些值得推荐?(知乎转载)...
- python人脸识别毕业设计-Python 40行代码实现人脸识别功能
- 有道python网课怎么样-如何用python“优雅的”调用有道翻译?
- python做小程序-【实战案例】利用Python做出趣味版防沉迷小程序
- python对文件的读操作方法有哪些-python--文件的读写操作