监听器模式介绍
监听器模式的要素
- 事件
- 监听器
- 广播器
- 触发机制
SpringBoot监听器实现
系统事件
事件发送顺序
监听器注册
监听器注册和初始化器注册流程类似
监听器触发机制
获取监听器列表核心流程:
通用触发条件:
自定义监听器实现
实现方式1
实现监听器接口:
@Order(1)
public class FirstListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("hello first");
}
}
配置resources/META-INF/spring.factories
:
org.springframework.context.ApplicationListener=com.mooc.sb2.listener.FirstListener
实现方式2
启动类中进行添加
@Order(2)
public class SecondListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("hello second");
}
}
@SpringBootApplication
@MapperScan("com.mooc.sb2.mapper")
public class Sb2Application {
public static void main(String[] args) {
// SpringApplication.run(Sb2Application.class, args);
SpringApplication springApplication = new SpringApplication(Sb2Application.class);
// springApplication.addInitializers(new SecondInitializer());
springApplication.addListeners(new SecondListener());
springApplication.run(args);
}
}
实现方式3
properties文件中进行配置
同初始化器一样,同样需要注意,这种方式的Order会失效,跟前面两种方式相比始终都是最先加载
@Order(3)
public class ThirdListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("hello third");
}
}
key值context.listener.classes
value值: listener类的全类名
context.listener.classes=com.mooc.sb2.listener.ThirdListener
实现方式4
自定义制定监听器对哪一类事件感兴趣
@Order(4)
public class FourthListener implements SmartApplicationListener {
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return ApplicationStartedEvent.class.isAssignableFrom(eventType) || ApplicationPreparedEvent.class.isAssignableFrom(eventType);
}
@Override
public void onApplicationEvent(ApplicationEvent event) {
System.out.println("hello fourth");
}
}
配置resources/META-INF/spring.factories
:
org.springframework.context.ApplicationListener=com.mooc.sb2.listener.FourthListener
启动后会发现"hello fourth"会被打印两次,因为两个事件都触发了,所以打印了两遍
面试题
- 介绍一下监听器模式?
-
- 结合源码图和四要素进行回答
- SpringBoot关于监听器相关的实现类有哪些?
-
- 可以通过spring.factories文件去看具体的实现类有哪些
- SpringBoot框架有哪些框架事件以及它们的发送顺序?
-
- 参考上面事件发送顺序流程图
- 介绍一下监听事件的触发机制?
-
- 围绕着监听器的加载注册,以及如何判断出监听器对某一个事件感兴趣进行作答
- 如何自定义实现系统监听器及注意事项?
- 实现
ApplicationListener
接口与SmartApplicantionListener
接口的区别?
-
ApplicationListener
只能指定对某一类事件的监听,而SmartApplicantionListener
可以实现指定对多类事件的监听