说明
本文用实例来介绍如何在SpringBoot中自定义事件来使用观察者模式。
事件的顺序
可使用实现Ordered接口的方式,调整监听器顺序。
注意:必须是同时实现 ApplicationListener<MyEvent>,Ordered这样的方法才能控制顺序。
下边几种都是无法控制顺序的:
@Component+@EventListerner+实现Ordered实现 ApplicationListener<MyEvent>+@Order 步骤1:自定义事件通过继承ApplicationEvent来自定义事件。
构造器的参数为该事件的相关数据对象,监听器可以获取到该数据对象,进而进行相关逻辑处理。
步骤2:自定义监听器 方案1:ApplicationListener法1:@EventListener
监听单个事件
或者
上边的办法比较好,因为不需要类型转换了。直接就能确定是MyEvent类型。
监听多个事件
事件进来之后,可以使用if(event instanceOf MyEvent.class)来判断是哪种事件。
监听所有ApplicationEvent
若使用这种写法,启动时会打印很多Spring自带的事件。任意ApplicationEvent都会进入这里边。
法2:实现ApplicationListener<T>接口
方案2:SmartApplicationListener源码如下
supportsEventType:支持的事件的类型
supportsSourceType:支持的数据的类型
getOrder:2147483641:是2^31-1,也就是32位的int的最大正数 。
示例
事件
监听器1
监听器2
发布器
测试
启动后,访问:http://localhost:8080/test1
后端输出:
发布器所在线程:http-nio-8080-exec-2监听器: MyListener2 所在线程: http-nio-8080-exec-2 事件: com.example.event.MyEvent[source=Hello] 事件的数据:Hello 是MyEvent?:true监听器: MyListener 所在线程: http-nio-8080-exec-2 事件: com.example.event.MyEvent[source=Hello] 事件的数据:Hello 是MyEvent?:true
如果将监听器的实现的Ordered顺序颠倒,则输出结果如下:
发布器所在线程:http-nio-8080-exec-1监听器: MyListener 所在线程: http-nio-8080-exec-1 事件: com.example.event.MyEvent[source=Hello] 事件的数据:Hello 是MyEvent?:true监听器: MyListener2 所在线程: http-nio-8080-exec-1 事件: com.example.event.MyEvent[source=Hello] 事件的数据:Hello 是MyEvent?:true
步骤3:注册监听器 方式适用范围能否搭配@Async注解,进行异步监听@Component所有监听器能application.yml中添加配置实现ApplicationListener<T>接口的监听器不能启动类中注册实现ApplicationListener<T>接口的监听器不能 法1:@Component(适用于所有监听器) 法2:application.yml中添加配置只适用于实现ApplicationListener<T>接口的监听器
context: listener: classes: com.example.event.MyListener,com.example.event.MyListener2
法3:启动类中注册只适用于实现ApplicationListener<T>接口的监听器
步骤4:发布事件 法1:注入ApplicationContext,调用其publishEvent方法 法2:启动类中发布以上就是SpringBoot实现自定义事件的方法详解的详细内容,更多关于SpringBoot自定义事件的资料请关注七叶笔记其它相关文章!