我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring注解驱动之@EventListener注解使用方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring注解驱动之@EventListener注解使用方式

概述

之前我们说过可以通过实现ApplicationListener接口来监听处理事件。

其实还有一种注解方式来监听处理事件。即使用@EventListener注解,通过该注解就可以在方法上监听事件了。

这样普通的业务逻辑组件中就可以直接使用这个注解来监听事件了,无需实现ApplicationListener接口了,确实比较方便,但是其原理是和ApplicationListener接口一样的,也可以自定义一个多波器实现异步监听事件,定义方法与之前一致。Spring注解驱动之ApplicationListener异步处理事件

@EventListener注解的用法

首先,编写一个普通的业务逻辑组件,例如UserService,并在该组件上标注一个@Service注解。

我们只需要简单的在该方法上标注一个@EventListener注解,就可以让方法来监听事件了。可以通过注解的classes属性来指定需要监听的事件。

例如,我们可以让listen方法监听ApplicationEvent及其子事件。

最后我们在参数的位置上写一个ApplicationEvent参数来接收事件,参数值是在Spring框架调用的时候自动赋值的。

package com.meimeixia.ext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@Service
public class UserService {
	
	// 一些其他的方法...
	@EventListener(classes=ApplicationEvent.class)
	public void listen(ApplicationEvent event) {
		System.out.println("UserService...监听到的事件:" + event);
	}
}

写个测试用例。

package com.meimeixia.test;
import org.junit.Test;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.meimeixia.ext.ExtConfig;
public class IOCTest_Ext {
	
	@Test
	public void test01() {
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
		
		// 发布一个事件
		applicationContext.publishEvent(new ApplicationEvent(new String("我发布的事件")) {
		});
		
		// 关闭容器
		applicationContext.close();
	}
}

你会发现Eclipse控制台打印出了如下内容,可以清晰地看到,不仅我们之前编写的监听器(例如MyApplicationListener)收到了事件,而且UserService组件也收到了事件。

也就是说,每一个都能正确地收到事件。

@EventListener注解的原理

我们可以点进去@EventListener这个注解里面去看一看,如下图所示,可以看到这个注解上面有一大堆的描述,从描述中我们可以猜到这个注解的内部工作原理。

描述中有一个醒目的字眼,即参考EventListenerMethodProcessor。意思可能是说,如果你想搞清楚@EventListener注解的内部工作原理,那么可以参考EventListenerMethodProcessor这个类。

EventListenerMethodProcessor是一个处理器,其作用是来解析方法上的@EventListener注解的。

这也就是说,Spring会使用EventListenerMethodProcessor来解析方法上的@EventListener注解。

因此,搞清楚这个处理器是怎样工作的,就搞清楚了@EventListener注解的内部工作原理。

仔细看一下SmartInitializingSingleton接口中afterSingletonsInstantiated方法上面的描述信息,不难看出该方法是在所有的单实例bean已经全部被创建完了以后才会被执行。

在介绍SmartInitializingSingleton接口的时候,我们也能从描述信息中知道,在所有的单实例bean已经全部被创建完成以后才会触发该接口。紧接着下面一段的描述还说了,该接口的调用时机有点类似于ContextRefreshedEvent事件,即在容器刷新完成以后,便会回调该接口。也就是说,这个时候容器已经创建完了。

如果所有的单实例bean都已经创建完了,也就是说下面这一步都执行完了,那么说明IOC容器已经创建完成了。

紧接着便会来调用finishRefresh方法,容器已经创建完了,此时就会来发布容器已经刷新完成的事件。

这就呼应了开头的那句话,即SmartInitializingSingleton接口的调用时机有点类似于ContextRefreshedEvent事件,即在容器刷新完成以后,便会回调该接口。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring注解驱动之@EventListener注解使用方式

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

下载Word文档

猜你喜欢

Spring注解之@Import使用方法讲解

@Import是Spring基于Java注解配置的主要组成部分,下面这篇文章主要给大家介绍了关于Spring注解之@Import的简单介绍,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
2023-01-03

Spring之Scope注解使用详解

spring的bean管理中,每个bean都有对应的scope。在BeanDefinition中就已经指定scope,默认的RootBeanDefinition的scope是prototype类型,使用@ComponentScan扫描出的BeanDefinition会指定是singleton,最常使用的也是singleton
2023-02-07

Spring注解之@validated使用详解

spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理,这篇文章主要介绍了Spring注解之@validated使用,需要的朋友可以参考下
2023-01-09

Spring注解之@Import注解的使用和源码分析

今天主要介绍Spring@Import注解,在Spring中@Import使用得比较频繁,它得作用是导入bean,具体的导入方式有多种,特别在SpringBoot项目中,很多地方都使用到了@Import注解,感兴趣的小伙伴可以参考阅读
2023-05-16

Spring注解驱动开发之属性赋值的示例分析

这篇文章给大家分享的是有关Spring注解驱动开发之属性赋值的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、@Value注解在Person的属性上使用@Value注解指定注入值public class
2023-06-15

Spring使用注解方式实现创建对象

这篇文章主要介绍了Spring使用注解方式实现创建对象,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2023-02-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录