Spring 5底层原理 系列的学习笔记
文章目录
-
- `SpringApplication#run(java.lang.String…)`
SpringApplication#run(java.lang.String...)
源码
public ConfigurableApplicationContext run(String... args) {
long startTime = System.nanoTime();
DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
ConfigurableApplicationContext context = null;
this.configureHeadlessProperty();
// 获取事件分发器
SpringApplicationRunListeners listeners = this.getRunListeners(args);
listeners.starting(bootstrapContext, this.mainApplicationClass);
try {
// 封装启动 args
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
//Environment 即环境对象,是对配置信息的抽象,配置信息的来源有多种,比如:
// 系统环境变量、properties 配置文件、YAML 配置文件等等。
// SpringBoot 提供了名为 ApplicationEnvironment 的类表示环境对象,
// 它是 Spring 中 StandardEnvironment 环境对象的子类。
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
this.configureIgnoreBeanInfo(environment);
// 打印banner
Banner printedBanner = this.printBanner(environment);
context = this.createApplicationContext();
服务器托管网
context.setApplicationStartup(this.applicationStartup);
this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
// 刷新容器
this.refreshContext(context);
// 刷新后置处理
this.afterRefresh(context, applicationArguments);
Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);
if (this.logStartupInfo) {
(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), timeTakenToStartup);
}
listeners.started(context, timeTakenToStartup);
this.callRunners(context, applicationArguments);
} catch (Throwable var12) {
this.handleRunFailure(context, var12, listeners);
throw new IllegalStateException(var12);
}
try {
Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime);
listeners.ready(context, timeTakenToReady);
return context;
} catch (Throwable var11) {
this.handleRunFailure(context, var11, (SpringApplicationRunListeners)null);
throw new IllegalStateException(var11);
}
}
总结
- 得到 SpringApplicationRunListeners 事件发布器
发布 Application Starting 事件 1️⃣
- 封装启动 args
- 准备 Environment 添加命令行参数
- ConfigurationPropertySources 处理
发布 Application Environment 已准备事件 2️⃣
- 通过 EnvironmentPostProcessorApplicationListener 进行 env 后处理
application.properties 由 StandardConfigDataLocationResolver 解析
spring.application.json
- 绑定 spring.main 到 SpringApplication 对象
- 打印 Banner
- 创建容器
- 准备容器
发布 Application Context 已初始化事件 3️⃣
- 加载 Bean 定义
发布 Application Prepared 事件 4️⃣
- refresh 容器
发布 Application Started 事件 5️⃣
- 执行 Runner
发布 Application Ready 事件 6️⃣
这其中有异常,发布 Application Failed 事件 7️⃣
服务器托管,北京服务器托管服务器托管网,服务器租用 http://www.fwqtg.net