SpringBoot监听器解析

本文详细介绍了监听器模式在SpringBoot中的应用,包括其要素、触发机制、实现方式(接口实现、SpringApplication添加、配置文件和SmartApplicationListener),以及注意事项和面试题答案。
摘要由CSDN通过智能技术生成

监听器模式介绍

监听器模式的要素

  • 事件
  • 监听器
  • 广播器
  • 触发机制

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可以实现指定对多类事件的监听
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值