Spring/SpringBoot 事件监听机制是什么


本篇文章给大家分享的是有关Spring/SpringBoot 事件监听机制是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。事件监听机制可以理解为是一种观察者模式,有数据发布者(事件源)和数据接受者(监听器);在Java中,事件对象都是继承java.util.EventObject对象,事件监听器都是java.util.EventListener实例;EventObject对象不提供默认构造器,需要外部传递source参数,即用于记录并跟踪事件的来源;Spring事件Spring事件对象为ApplicationEvent,继承EventObject,源码如下:Spring事件监听器为ApplicationListener,继承EventListener, 源码如下:实现Spring事件监听有两种方式:鸿蒙官方战略合作共建——HarmonyOS技术社区面向接口编程,实现ApplicationListener接口;基于注解驱动,@EventListener(Spring自定义的注解);实例:面向接口编程,实现ApplicationListener接口:自定义事件对象:自定义事件监听器:启动服务并发布事件:运行结果:使用注解 @EventListener实现Spring事件监听:启动并发布事件:运行结果:通过实例可以看出,上面两种方式都可正常发布和接收事件。实现原理通过上面实例可以看出,context 可以发布事件,那底层是怎么发布的,让我们继续看源码:通过源码我们可以看出,事件应该是通过ApplicationEventMulticaster发布的,我们继续看:Spring 中事件发布都是通过SimpleApplicationEventMulticaster来实现的可以看出,如果设置了Executor则异步发送,否则同步;而且可以看出通过 resolveDefaultEventType(event) 对发布的事件类型进行了校验,这就是为什么我们可以直接使用泛型来指定我们想接收的事件对象, 比如上面的 ApplicationListener。最后就使用对应的ApplicationListener进行接收和处理就行了,那么ApplicationListener是什么时候注册的呢?如何添加ApplicationListener?直接添加,使用content.addApplicationListener(上面实例中有使用);将自定义的ApplicationListener注册为一个Bean,Spring再初始化Bean之后会添加,具体代码在ApplicationListenerDetector#postProcessAfterInitialization,判断一个Bean如果是ApplicationListener,则也是使用context.addApplicationListener添加;使用注解@EventListener,在初始化Bean之后,会在EventListenerMethodProcessor中进行处理和添加;第三种实现的源码如下(EventListenerMethodProcessor中):Spring内建事件ContextRefreshedEvent: Spring应用上下文就绪事件;ContextStartedEvent: Spring应用上下文启动事件;ContextStopedEvent: Spring应用上下文停止事件;ContextClosedEvent: Spring应用上下文关闭事件;Spring Boot事件Spring Boot事件是在Spring事件基础上进行的封装事件对象改为SpringApplicationEvent,事件源为SpringApplication(Spring事件源为Context);底层发布事件还是使用SimpleApplicationEventMulticaster 对象,不过有点需要说明的是,Spring Boot 1.4开始,SpringApplication和ApplicationContext使用的都是SimpleAp免费云主机域名plicationEventMulticaster实例,但是两者属于不同的对象(1.0 ~ 1.3版本是同一个对象);事件回顾:运行结果:从结果可以看出,事件对象类型和事件源,以及事件发布顺序。以上就是Spring/SpringBoot 事件监听机制是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注云编程开发博客行业资讯频道。

相关推荐: 创建逻辑卷并配置ftp

1.创建用户teacher并指定其家目录为/ftproot,密码设置为pwd@123(5分)[root@localhost ~]# useradd -d /ftproot teacher[root@localhost ~]# echo pwd@123 |pas…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/02 17:34
下一篇 02/02 17:34