广告
返回顶部
首页 > 资讯 > 精选 >Spring的事件发布与监听方式是什么
  • 704
分享到

Spring的事件发布与监听方式是什么

2023-07-05 16:07:25 704人浏览 薄情痞子
摘要

本篇内容介绍了“spring的事件发布与监听方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!事件主要代码在org.springfra

本篇内容介绍了“spring的事件发布与监听方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

事件

主要代码在org.springframework.contextorg.springframework.context.event包中

事件发布与监听主要包含以下角色:

  • 事件:ApplicationEvent

  • 事件监听器:ApplicationListener SmartApplicationListener GenericApplicationListener

  • 事件发布器:ApplicationEventPublisher

  • 事件广播器:ApplicationEventMulticaster

引入ApplicationListener有两种方式:

  • spring spi

  • 手动注入bean

手动注入bean有两种方式:

  • 类上注解@Component等注解+实现ApplicationListener接口

  • 类上注解@Component等注解+方法上注解@EventListener

案例如下:

// bean注入方式一,实现ApplicationListener+@Component注入bean@Componentpublic class HelloEventListener implements SmartApplicationListener {    @Override    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {        return false;    }    @Override    public void onApplicationEvent(ApplicationEvent event) {    }}// bean注入方式二,@EventListener+@Component@Componentpublic class Test {    @EventListener    public void listen(Object obj){        System.out.println("listening");    }    @EventListener(classes={ApplicationEvent.class},condition="springEL")    public void listen(ApplicationEvent event){        System.out.println("listening");    }}

关于@EventListener注解方法注入是通过EventListenerMethodProcessor的一个SmartInitializingSingleton,同时该类也是一个BeanFactoryPostProcessor,但扫描@EventListener方法和注入逻辑不在该接口的postProcess方法中,而是SmartInitializingSingleton接口的afterSingletonsInstantiated方法。

关于SmartInitializingSingleton的接口作用注释如下:

Callback interface triggered at the end of the singleton pre-instantiation phase during BeanFactory bootstrap. This interface can be implemented by singleton beans in order to perfORM some initialization after the regular singleton instantiation alGorithm, avoiding side effects with accidental early initialization (e.g. from ListableBeanFactory.getBeansOfType calls). In that sense, it is an alternative to InitializingBean which gets triggered right at the end of a bean&rsquo;s local construction phase.

看到其作用和 InitializingBean 类似,用于构造函数后的初始化操作,不过该接口是所有bean被创建之后被调用。在所有 bean的构造方法、初始化(@PostConstructInitializingBean)、BeanPostProcessor都执行完毕后再执行该接口方法,注意是所有bean都执行完这些方法。

Invoked right at the end of the singleton pre-instantiation phase, with a guarantee that all regular singleton beans have been created already.

public class EventListenerMethodProcessorimplements SmartInitializingSingleton, ApplicationContextAware, BeanFactoryPostProcessor {// 负责设置EventListenerFactory@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 回调beanFactory赋值this.beanFactory = beanFactory;// 拿到所有的EventListenerFactoryMap<String, EventListenerFactory> beans = beanFactory.getBeansOfType(EventListenerFactory.class, false, false);List<EventListenerFactory> factories = new ArrayList<>(beans.values());AnnotationAwareOrderComparator.sort(factories);// 设置eventListenerFactoriesthis.eventListenerFactories = factories;}@Overridepublic void afterSingletonsInstantiated() {...processBean(beanName, type);...}private void processBean(final String beanName, final Class<?> targetType) {if (// 不包含@EventListener的类的备忘录是否有该类型!this.nonAnnotatedClasses.contains(targetType) &&// 该类型的type, method or field 是否能被注解@EventListenerAnnotationUtils.isCandidateClass(targetType, EventListener.class) &&// 不能是org.springframework开头的类,或者被注解了@Component,注意是或者!isSprinGContainerClass(targetType)) {// 提取所有的方法Map<Method, EventListener> annotatedMethods = null;try {annotatedMethods = MethodIntrospector.selectMethods(targetType,(MethodIntrospector.MetadataLookup<EventListener>) method ->AnnotatedElementUtils.findMergedAnnotation(method, EventListener.class));}...if (CollectionUtils.isEmpty(annotatedMethods)) {// 备忘录,加入已扫描的没有注解@EventListener的类this.nonAnnotatedClasses.add(targetType);...}else {// Non-empty set of methodsConfigurableApplicationContext context = this.applicationContext;Assert.state(context != null, "No ApplicationContext set");List<EventListenerFactory> factories = this.eventListenerFactories;Assert.state(factories != null, "EventListenerFactory List not initialized");for (Method method : annotatedMethods.keySet()) {for (EventListenerFactory factory : factories) {if (factory.supportsMethod(method)) {Method methodToUse = aopUtils.selectInvocableMethod(method, context.getType(beanName));// 生成ApplicationListenerApplicationListener<?> applicationListener =factory.createApplicationListener(beanName, targetType, methodToUse);if (applicationListener instanceof ApplicationListenerMethodAdapter) {((ApplicationListenerMethodAdapter) applicationListener).init(context, this.evaluator);}context.addApplicationListener(applicationListener);break;}...

ApplicationListener监听到事件后的执行是同步过程,如果需要异步,可搭配@Async+@EventListener

事务消息监听器

spring-tx包下提供TransactionalApplicationListener接口和@TransactionalEventListener注解。

TransactionalApplicationListener接口:An ApplicationListener that is invoked according to a TransactionPhase. NOTE: Transactional event listeners only work with thread-bound transactions managed by a PlatformTransactionManager.

“Spring的事件发布与监听方式是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Spring的事件发布与监听方式是什么

本文链接: https://www.lsjlt.com/news/353558.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring的事件发布与监听方式是什么
    本篇内容介绍了“Spring的事件发布与监听方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!事件主要代码在org.springfra...
    99+
    2023-07-05
  • Spring事件发布监听,顺序监听,异步监听方式
    目录1. Spring的事件通知2. Spring事件通知使用2.1 Spring的事件2.2 事件监听2.2.1 接口方式实现2.2.2 注解实现2.3 事件发布2.4 Sprin...
    99+
    2022-11-12
  • Spring事件发布与监听怎么实现
    这篇文章主要讲解了“Spring事件发布与监听怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring事件发布与监听怎么实现”吧!  一、事件监听相关概念介绍  1、流程分析  事...
    99+
    2023-06-02
  • 详解Spring事件发布与监听机制
    目录一、ApplicationContext 事件机制二、ApplicationListener 监听器三、ApplicationEvent 事件四、自定义事件和监听器五、注解式监听...
    99+
    2022-11-12
  • 解析Spring事件发布与监听机制
    前言 Spring 提供了 ApplicationContext 事件机制,可以发布和监听事件,这个特性非常有用。 Spring 内置了一些事件和监听器,例如在 Spring 容器启...
    99+
    2022-11-12
  • Spring事件发布与监听机制的用法示例
    小编给大家分享一下Spring事件发布与监听机制的用法示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、ApplicationContext 事件机制Appl...
    99+
    2023-06-20
  • Spring/SpringBoot 事件监听机制是什么
    本篇文章给大家分享的是有关Spring/SpringBoot 事件监听机制是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。事件监听机制可以理解为是一种观察者模式,有数据发布...
    99+
    2023-06-17
  • Flutter事件监听与EventBus事件应用的方法是什么
    这篇文章主要介绍“Flutter事件监听与EventBus事件应用的方法是什么”,在日常操作中,相信很多人在Flutter事件监听与EventBus事件应用的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-07-06
  • SpringBoot如何实现ApplicationEvent事件的监听与发布
    这篇文章主要介绍“SpringBoot如何实现ApplicationEvent事件的监听与发布”,在日常操作中,相信很多人在SpringBoot如何实现ApplicationEvent事件的监听与发布问题上存在疑惑,小编查阅了各式资料,整理...
    99+
    2023-07-05
  • 详解SpringBoot实现ApplicationEvent事件的监听与发布
    目录新建SpringBoot项目实现代码pom.xmlApplication.javaTaskPoolConfig.javaEmailDto.javaSendEmailEvent.j...
    99+
    2023-03-08
    SpringBoot ApplicationEvent事件监听发布 SpringBoot ApplicationEvent事件监听 SpringBoot ApplicationEvent事件发布 Sp
  • jQuery3种常见事件监听方式是什么
    这篇文章主要为大家展示了“jQuery3种常见事件监听方式是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery3种常见事件监听方式是什么”这篇文章吧。1.HTML标签内联事件实例1:...
    99+
    2023-06-29
  • springevent事件异步处理方式(发布,监听,异步处理)
    目录spring event 事件异步处理(发布,监听,异步处理)spring事件之异步线程执行Spring 事件发布监听的多种实现异步方法解决方案总结spring event 事件...
    99+
    2023-02-14
    spring event事件异步 event事件发布 event事件监听 event事件异步处理
  • JS添加事件监听的方法是什么
    这篇文章主要介绍“JS添加事件监听的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS添加事件监听的方法是什么”文章能帮助大家解决问题。1.我们一般在的事件添加时是这样做的:elm.onc...
    99+
    2023-06-26
  • JavaScript中的事件监听是什么
    这篇文章主要介绍“JavaScript中的事件监听是什么”,在日常操作中,相信很多人在JavaScript中的事件监听是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2022-10-19
  • JavaScript怎么利用发布订阅模式编写事件监听函数
    这篇“JavaScript怎么利用发布订阅模式编写事件监听函数”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScri...
    99+
    2023-07-06
  • Java中的事件监听机制是什么
    这篇文章给大家介绍Java中的事件监听机制是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。鼠标事件监听机制的三个方面:1.事件源对象:事件源对象就是能够产生动作的对象。在Java语言中所有的容器组件和元素组件都是事...
    99+
    2023-05-31
    java 事件监听机制 ava
  • android中对截图事件进行监听的原理是什么
    这篇文章给大家介绍android中对截图事件进行监听的原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。监听截屏图片所在目录变化(FileObserver)监听媒体库的变化(ContentObserver)&nb...
    99+
    2023-05-30
    android 中对 roi
  • spring整合redis消息监听通知使用的方法是什么
    本篇内容介绍了“spring整合redis消息监听通知使用的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题引入在电商系统中,秒...
    99+
    2023-06-22
  • android事件分发与处理的方法是什么
    Android事件分发与处理的方法主要有以下几种:1. 触摸事件分发处理:Android中的触摸事件主要包括按下、移动、抬起等动作。...
    99+
    2023-09-13
    android
  • Spring的存储方式与获取方式是什么
    本篇内容介绍了“Spring的存储方式与获取方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!存储方式(注解)使用注解的方式存储业务对...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作