对于 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连击呗
领取专属 10元无门槛券
私享最新 技术干货