首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入理解@EventListener注解的使用以及工作原理解读

对于 Spring 容器的一些事件,可以监听并且触发相应的方法。通常的方法有 2 种,ApplicationListener接口和@EventListener 注解。日常开发你更喜欢那种模式呢?

背景

在开发工作中,会遇到一种场景,做完某一件事情以后,需要广播一些消息或者通知,告诉其他的模块进行一些事件处理,一般来说,可以一个一个发送请求去通知,但是有一种更好的方式,那就是事件监听,事件监听也是设计模式中 发布-订阅模式、观察者模式的一种实现。

观察者模式:简单的来讲就是你在做事情的时候身边有人在盯着你,当你做的某一件事情是旁边观察的人感兴趣的事情的时候,他会根据这个事情做一些其他的事,但是盯着你看的人必须要到你这里来登记,否则你无法通知到他(或者说他没有资格来盯着你做事情)。

对于容器的一些事件,可以监听并且触发相应的方法。通常的方法有 2 种,接口和注解。

简介

要想顺利的创建监听器,并起作用,这个过程中需要这样几个角色:

事件可以封装和传递监听器中要处理的参数,如对象或字符串,并作为监听器中监听的目标。

监听器具体根据事件发生的业务处理模块,这里可以接收处理事件中封装的对象或字符串。

事件发布者事件发生的触发者。

ApplicationListener 接口

接口的定义如下:

它是一个泛型接口,泛型的类型必须是及其子类,只要实现了这个接口,那么当容器有相应的事件触发时,就能触发t 方法。类的子类有很多,Spring 框架自带的如下几个。

▐  简单使用

使用方法很简单,就是实现一个接口,并且将加入到容器中就行。

启动项目

查看日志

自定义事件以及监听

▐  定义事件

▐  定义监听器

@EventListener 注解

▐  简单使用

除了通过实现接口,还可以使用注解,实现对任意的方法都能监听事件。

在任意方法上标注r 注解,指定,即需要处理的事件类型,一般就是及其子类,可以设置多项。

此时,就可以有一个发布,两个监听器监听到发布的消息了,一个是注解方式,一个是非注解方式

结果:

原理

其实上面添加注解的方法被包装成了对象,上面的类似于下面这种写法,这个应该比较好理解。

查看的源码,找到下面的代码,因为我是Tomcat环境,这里创建的t是

构造方法如下

进入里面

再进到的方法里面,省略了一部分代码,可以看到他注册了一个类到工厂了。这是一个y的后置处理器。

查看这个的后置处理器r,下面方法,他会遍历所有,找到其中带有的方法,将它包装成,注册到工厂里,这样就成功注册到的监听系统里了。

由方法生成的逻辑由完成的,这又分为两种,一种是普通的另一种是,是由两个工厂处理的。

总结

上面介绍了的原理,其实上面方法里还有一个注解,其实原理是一模一样的,只是这个监听者可以选择在事务完成后才会被执行,事务执行失败就不会被执行。

这两个注解的逻辑是一模一样的,并且本身就被标记有,

只是最后生成监听器时所用的工厂不一样而已。

-END-

往期推荐

深入浅出 SpringBoot | @Profile 巧妙切换Spring的环境变量

微服务架构 | Spring Boot 快速集成Thymeleaf模板引擎

深入浅出 SpringBoot | @EnableConfigurationProperties 的工作原理

微服务架构 | Hystrix 熔断降级需要注意哪些点?

微服务架构 | Hystrix的资源隔离策略该如何选择?

分享、点赞、在看,给个3连击

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20211115A0418C00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券