Springboot2源码分析-4监听器初始化(root)

SpringApplicationRunListeners 初始化

SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting(bootstrapContext, this.mainApplicationClass);

本次主要分析这2行代码,从字面上理解应该是获取监听,以及初始化content的监听功能,接着看getRunListeners

private SpringApplicationRunListeners getRunListeners(String[] args) {
	Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };
	return new SpringApplicationRunListeners(logger,
			getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args),
			this.applicationStartup);
}

先看看new SpringApplicationRunListeners中的getSpringFactoriesInstances这个方法做了什么事情
其实上一章我们已经讲述过这个方法主要是获取对象的

getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args)

这个主要是看传入了什么接口,然后会从工map中获取对应有哪些实现,然后将这些实现一一启动
我从META-INF/spring.factories看到

# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener

很明显,Listener主要就是初始化这个监听器
在这里插入图片描述
从断点总看到,确实我我们猜测的一样,确实是这个类
找到这个类之后接下来就是启动这个监听了

我们在仔细的分析一下监听启动代码

void starting(ConfigurableBootstrapContext bootstrapContext, Class<?> mainApplicationClass) {
	doWithListeners("spring.boot.application.starting", (listener) -> listener.starting(bootstrapContext),
			(step) -> {
				if (mainApplicationClass != null) {
					step.tag("mainApplicationClass", mainApplicationClass.getName());
				}
			});
}

最终还是要看这个方法

private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction, Consumer<StartupStep> stepAction) {
	StartupStep step = this.applicationStartup.start(stepName);
	this.listeners.forEach(listenerAction);
	if (stepAction != null) {
		stepAction.accept(step);
	}
	step.end();
}

从debug的结果来看,这段代码会被执行多次

  • 1 执行类:SpringApplicationRunListener
  • 步骤名称:spring.boot.application.starting
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值