springboot启动-监听器模块

本文介绍了SpringBoot启动过程中监听器模块的工作流程,包括SpringApplicationRunListeners、SpringApplicationRunListener、ApplicationEventMulticaster和ApplicationListener的角色。通过源码分析,阐述了事件发布和监听的实现细节,以及可能遇到的ClassCastException异常。文章还提供了设计总结和实践经验,建议避免使用lambda方式创建监听器,并鼓励读者进一步学习和实践。
摘要由CSDN通过智能技术生成

监听器模块简介

  1. springboot在启动过程中会调用监听器模块,将开始事件、环境准备事件、启动完成/失败、准备完成等事件发布出去,客户端可以监听各种类型的事件进行特殊处理。

工作流程

  1. 服务端发布消息入口:SpringApplicationRunListeners,遍历调用SpringApplicationRunListener接口列表
  2. 中间服务商:SpringApplicationRunListener,提供发布消息的接口方法,底层调用ApplicationEventMulticaster的广播接口发布消息
  3. 底层维护者:ApplicationEventMulticaster,维护客户端订阅的监听实例,可以添加、删除监听器,可以将消息广播给对应的监听器
  4. 客户端订阅:ApplicationListener,提供给客户端实现接口

源码分析

  1. 监听器模块主要分为几个核心接口:
    SpringApplicationRunListeners->持有服务端SpringApplicationRunListener列表
    SpringApplicationRunListener->服务端调用监听接口
    ApplicationListener->提供给客户端订阅的监听接口
    ApplicationEventMulticaster->事件广播接口,负责维护客户端订阅的监听接口列表
  2. 我们常监听的springboot事件如下(有序):
    ApplicationStartingEvent
    ApplicationEnvironmentPreparedEvent
    ApplicationFailedEvent
    ApplicationStartedEvent
    ApplicationReadyEvent

SpringApplicationRunListeners

  1. 这是一个入口类,在SpringApplication的run方法中进行调度,下面我们看下SpringApplicationRunListeners的相关源码:
属性:SpringApplicationRunListener集合是springboot启动时从spring.factory配置文件中读取
private final List<SpringApplicationRunListener> listeners;
构造器:
SpringApplicationRunListeners(Log log,
		Collection<? extends SpringApplicationRunListener> listeners) {
	this.log = log;
	// 外部传入SpringApplicationRunListener实例列表
	this.listeners = new ArrayList<>(listeners);
}
核心方法:
public void starting() {
	for (SpringApplicationRunListener listener : this.listeners) {
		listener.starting();
	}
}

public void environmentPrepared(ConfigurableEnvironment environment) {
	for (SpringApplicationRunListener listener : this.listeners) {
		listener.environmentPrepared(environment);
	}
}

public void contextPrepared(ConfigurableApplicationContext context) {
	for (SpringApplicationRunListener listener : this.listeners) {
		listener.contextPrepared(context);
	}
}

public void contextLoaded(ConfigurableApplicationContext context) {
	for (SpringApplicationRunListener listener : this.listeners) {
		listener.contextLoaded(context);
	}
}

public void started(ConfigurableApplicationContext context) {
	for (SpringApplicationRunListener listener : this.listeners) {
		listener.started(context);
	}
}

public void running(ConfigurableApplicationContext context) {
	for (SpringApplicationRunListener listener : this.listeners) {
		listener.running(context);
	}
}

public void failed(ConfigurableApplicationContext context, Throwable exception) {
	for (SpringApplicationRunListener listener : this.listeners) {
		callFailedListener(listener, context, exception);
	}
}

SpringApplicationRunListener

实现类:EventPublishingRunListener

  1. EventPublishingRunListener目前是SpringApplicationRunListener接口的唯一实现类,并通过spring.factory进行读取类路径配置,进行实例化
  2. EventPublishingRunListener内部封装了调用ApplicationEventMulticaster接口的逻辑,实现消息的发布
属性:
priva
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值