【Spring boot读书笔记】 SpringApplication-运行阶段

SpringApplication运行阶段属于核心过程,完整的围绕run(String…)方法展开。该过程结合初始化阶段完成的状态,进一步完善了运行时所需要的准备的资源,随后启动Spring应用上下文,在此期间伴随着Spring Boot和Spring事件的触发,形成完整的SpringApplication生命周期。因此,生命周期也可以分为以下三个阶段:

  • SpringApplication准备阶段
  • ApplicationContext启动阶段
  • ApplicationContext启动后阶段

SpringApplication准备阶段

源码解析


public class SpringApplication {
	
	...
	
	// 准备阶段
	public ConfigurableApplicationContext run(String... args) {
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		ConfigurableApplicationContext context = null;
		Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
		configureHeadlessProperty();
		
		// 监听器:SpringApplicationRunListeners -> SpringApplicationRunListener
		SpringApplicationRunListeners listeners = getRunListeners(args);
		listeners.starting();
		try {
			// 运行参数:ApplicationArguments 
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(
					args);
			// 环境变量:Environment、ConfigurablePropertyResolver
			ConfigurableEnvironment environment = prepareEnvironment(listeners,
					applicationArguments);
			configureIgnoreBeanInfo(environment);
			// banner
			Banner printedBanner = printBanner(environment);
			context = createApplicationContext();
			// 启动异常Exporter
			exceptionReporters = getSpringFactoriesInstances(
					SpringBootExceptionReporter.class,
					new Class[] { ConfigurableApplicationContext.class }, context);
			prepareContext(context, environment, listeners, applicationArguments,
					printedBanner);
			refreshContext(context);
			afterRefresh(context, applicationArguments);
			stopWatch.stop();
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass)
						.logStarted(getApplicationLog(), stopWatch);
			}
			listeners.started(context);
			callRunners(context, applicationArguments);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, exceptionReporters, listeners);
			throw new IllegalStateException(ex);
		}

		try {
			listeners.running(context);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, exceptionReporters, null);
			throw new IllegalStateException(ex);
		}
		return context;
	}

	...
}

整个阶段涉及的核心对象:

  • SpringApplicationRunListeners ->SpringApplicationRunListener
  • ApplicationArguments -> DefaultApplicationArguments
  • ConfigurableEnvironment
  • Banner
  • ConfigurableApplicationContext
  • SpringBootExceptionReporter

核心对象:SpringApplicationRunListeners & SpringApplicationRunListener


public class SpringApplication {
	...
	// 通过Spring工厂加载机制加载SpringApplicationRunListener
	private SpringApplicationRunListeners getRunListeners(String[] args) {
		Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };
		return new SpringApplicationRunListeners(logger, getSpringFactoriesInstances(
				SpringApplicationRunListener.class, types, this, args));
	}
	...
}


// SpringApplicationRunListener包装类,为每个SpringApplicationRunListener执行方法
class SpringApplicationRunListeners {

	private final Log log;

	private final List<SpringApplicationRunListener> listeners;
	
	SpringApplicationRunListeners(Log log,
			Collection<? extends SpringApplicationRunListener> listeners) {
		this.log = log;
		this.listeners = new ArrayList<>(listeners);
	}

	public void starting() {
		for (SpringApplicationRunListener listener : this.listeners) {
			listener.starting();
		}
	}
	
	...
}

// SpringBoot运行过程监听器
public interface SpringApplicationRunListener {

	// spring 应用刚启动 
	void starting();

	// ConfigurableEnviroment准备好,运行调整参数
	void environmentPrepared(ConfigurableEnvironment environment);

	// ConfigurableApplicationContext准备好
	void contextPrepared(ConfigurableApplicationContext context);

	// ConfigurableApplicationContext 已经装载好,但仍未启动
	void contextLoaded(ConfigurableApplicationContext context);

	// ConfigurableApplicationContext已启动,此时Spring Bean已经初始化完成
	void started(ConfigurableApplicationContext context);

	// Spring应用运行阶段
	void running(ConfigurableApplicationContext context);

	// Spring应用运行失败
	void failed(ConfigurableApplicationContext context, Throwable exception);

}

SpringBoot运行监听器配置:
META-INF\spring.factories

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

** 事件发布:EventPublishingRunListener**


// SpringBoot 默认唯一指定的监听器,用于向Spring发布广播事件
public class EventPublishingRunListener implements SpringApplicationRunListener, Ordered {

	private final SpringApplication application;

	private final String[] args;

	private final SimpleApplicationEventMulticaster initialMulticaster;

	public EventPublishingRunListener(SpringApplication application, String[] args) {
		this.application = application;
		this.args = args;
		this.initialMulticaster = new SimpleApplicationEventMulticaster();
		for (ApplicationListener<?> listener : application.getListeners()) {
			this.initialMulticaster.addApplicationListener(listener);
		}
	}

	@Override
	public int getOrder() {
		return 0;
	}

	@Override
	public void starting() {
		this.initialMulticaster.multicastEvent(
				new ApplicationStartingEvent(this.application, this.args));
	}
	
	...

}



// Spring事件广播
public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {

	@Nullable
	private Executor taskExecutor;

	@Nullable
	private ErrorHandler errorHandler;
	
	...
	
	@Override
	public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
		ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
		for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
			Executor executor = getTaskExecutor();
			if (executor != null) {
				executor.execute(() -> invokeListener(listener, event));
			}
			else {
				invokeListener(listener, event);
			}
		}
	}
	
	...
}

从EventPublishingRunListener中源代码可以看出,SpringBoot运行阶段会产生的事件:

监听方法SpringBoot事件Spring Boot 版本
starting()ApplicationStartingEvent1.5+
environmentPrepared()ApplicationEnvironmentPreparedEvent1.0+
contextPrepared()1.0+
contextLoaded()ApplicationPreparedEvent1.0+
started()ApplicationStartedEvent1.0+
running()ApplicationReadyEvent1.3+
failed()ApplicationFailedEvent1.0+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值