前言
不知道各位小伙伴对事件(event
)这个比较抽象的名词如何理解,从我实际开发和使用经验来说,事件通常指的是某一特定条件下触发的一组操作。
做过生态开发(ISV
)的小伙伴一定对事件不陌生,因为在和这些生态厂商(钉钉、企微、飞书等)进行业务交互的时候,总是避不开事件的,我们总是要对接他们的各种事件,比如入职事件、离职事件、用户变更事件、部门变更事件等等。
今天我们就来通过一个简单的示例,来演示下ApplicationListener
应用级事件的使用流程。
ApplicationEvent
是什么
一个事件主要包括以下几个要素:
- 事件注册
- 事件监听
- 事件触发
所以ApplicationEvent
就是spring
提供的一套集事件注册、监听、触发为一体的事件实现。
如何用
创建项目,增加模块配置
首先我们需要创建一个spring-boot
项目,然后在项目的resouces/META-INF
文件夹下增加名为spring.factories
的文件,如果文件夹不存在,需要手动创建。
这个文件的作用是配置spring boot
的常用组件,当然我们也可以通过注解的方式进行配置,关于注解的说明我们后面再说。
我们需要在文件中增加如下配置:
org.springframework.context.ApplicationListener=io.github.syske.springbootbeanlisttest.listener.SyskeApplicationListener
这个文件除了可以配置ApplicationListener
之外,还可以配置EnvironmentPostProcessor
、PropertySourceLoader
、SpringApplicationRunListener
,这几个组件的应用,我们后期也会逐一分享。
这种配置方式其实就是SPI
机制,这种配置的好处是,可以在不变更项目代码的基础上实现组件的增加和移除。
创建自己的ApplicationListener
,这里需要实现ApplicationListener
接口,并实现onApplicationEvent
方法,事件触发时,会执行该方法。
public class SyskeApplicationListener implements ApplicationListener<SyskeApplicationEvent> {
@Override
public void onApplicationEvent(SyskeApplicationEvent event) {
String eventName = event.getEventName();
System.out.println(eventName);
Object eventBody = event.getEventBody();
System.out.println(eventBody);
}
}
这个方法的入参是ApplicationEvent
或者它的子类,所以这里我们可以根据需要自定义自己的事件,并继承ApplicationEvent
public class SyskeApplicationEvent extends ApplicationEvent {
public SyskeApplicationEvent(Object source) {
super(source);
}
private String eventName;
private Object eventBody;
// getter/setter方法省略
}
事件注册
因为我们是直接在spring boot
项目中使用的spring
的事件组件,所以我们并不需要自己去做时间的注册,因为在spring boot
的启动过程中,会帮我们把事件进行注册,关于这块的内容,我在之前分享spring boot
启动过程的时候已经分享过了,感兴趣的小伙伴可以去看下(时间久到我都忘记了