监听器
SpringBoot的事件监听就用的是Spring的 没有变化
Spring的两种监听器
监听器的实现有两种方式:
- 实现ApplicationListener接口
- 加@EventListener
ApplicationListener用法
ApplicationListener通过监听容器中发布的一些事件,事件发生就会触发监听器的回调,就完成了事件驱动开发
写一个监听器
- 写一个监听器监听某个事件
- 实现ApplicationListener
- 把监听器加入到容器中
只要容器中有相关事件发布,我们就能监听到这个事件
测试结果:
监听到的两个事件
发布事件
我们也可以自己发布事件
我们可以把事件理解为一个对象,它存储了当前发生的事情的过程。
事件的创建:
- 直接new 一个ApplicationEvent
- 写一个类继承ApplicationEvent
// 发布事件
applicationContext.publishEvent(new ApplicationEvent(new String("我发布的事件")) {
});
@EventListener用法
在想监听事件的方法上加上@EventListener注解,注解中指定要监听哪种类型的事件
然后在方法上写上参数,获得监听到的事件
看结果和实现ApplicationListener接口的结果是一样的
事件驱动的流程
事件管理器要做的事:
- 得到所有的监听器
- 在有事件发布时,遍历监听器 判断哪个监听器对当前事件感兴趣即泛型匹配,就调用那个监听器
Spring源码分析监听器原理
创建ioc容器,调用refresh()方法
- 第一步:多播器/派发器
创建一个默认的事件管理器:SimpleApplicationEventMulticasterthis.initApplicationEventMulticaster();
- 第二步:注册监听器
由于Spring提供了两种监听器,因此refresh()的时候有两个地方拿监听器- 实现了ApplicationListener接口的
从容器中拿到所有的监听器,将他们都注册到事件管理器中this.registerListeners(
- 实现了ApplicationListener接口的