深入分析SpringBoot下的事件/监听机制以及实现所有事件的异步处理

本文深入解析SpringBoot的事件/监听机制,包括ApplicationListener和SpringApplicationRunListener。介绍了如何自定义监听器和事件,并展示了如何实现事件的异步处理,通过设置taskExecutor实现事件处理的并发执行。
摘要由CSDN通过智能技术生成

什么是事件/监听

监听/事件机制其实是由Spring实现的一种事件/监听器模式,可视为观察者模式。在Spring应用上下文ApplicationContext广播事件之后,监听器监听到后会做出相应事件的处理。

相应在SpringBoot中,在充分使用到Spring的ApplicationListener的同时也实现了SpringBoot的监听器SpringApplicationRunListener,实现了自己的事件/监听机制。本文具体介绍Spring下的事件/监听机制,SpringApplicationRunListener就不再展开了。

ApplicationListener 属于 org.springframework.context包下。
SpringApplicationRunListener属于 org.springframework.boot包下。

 

SpringBoot下的监听器

大家都知道SpringBoot是由SpringApplication.run()方法启动的,在SpringApplication的构造函数中,可以看到调用了一个名为setListeners的函数,该函数会将META-INF/spring.factories下所有的监听器加入到listeners属性中。

private List<ApplicationListener<?>> listeners;

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
  this.resourceLoader = resourceLoader;
  Assert.notNull(primarySources, "PrimarySources must not be null");
  this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
  this.webApplicationType = WebApplicationType.deduceFromClasspath();
  setInitializers((Collection) getSpringFactoriesInstances(
      ApplicationContextInitializer.class));
  // 将META-INF/spring.factories下所有的监听器加入到listeners属性中
  setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
  this.mainApplicationClass = deduceMainApplicationClass();
}

public void setListeners(Collection<? extends ApplicationListener<?>> listeners) {
  this.listeners = new ArrayList<>();
  this.listeners.addAll(listeners);
}

这个监听器列表会在org.springframework.context.support.AbstractApplicationContext#registerListeners 方法中被遍历添加进org.springframework.context.event.AbstractApplicationEventMulticaster.ListenerRetriever#applicationListeners 属性中。

protected void registerListeners() {
  for (ApplicationListener<?> listener : getApplicationListeners()) {
    getApplicationEventMulticaster().addApplicationListener(listener);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值