org.springframework.boot.SpringApplication类

org.springframework.boot.SpringApplication


SpringApplication.run():启动应用

Spring Boot应用启动流程:

  1. 开启SpringApplicationRunListeners监听器
  2. 创建应用上下文ConfigurableApplicationContext,通过应用上下文加载应用所需类和各种环境配置
  3. 启动一个应用实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class SpringApplication{
public ConfigurableApplicationContext run(String... args) {
//StopWatch是Spring中的秒表工具类
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
this.configureHeadlessProperty();
//根据入参开启监听器
SpringApplicationRunListeners listeners = this.getRunListeners(args);
listeners.started();
try{
//从入参组装ApplicationArguments
DefaultApplicationArguments ex = newDefaultApplicationArguments(args);
//创建、刷新应用上下文
context = this.createAndRefreshContext(listensers, ex);
this.afterRefresh(context, (ApplicationArguments) ex);
listeners.finished(context, (Throwable)null);
//结束计时
stopWatch.stop();
//打日志
if(this.logStartupInfo) {
(new StartupInfoLogger(this.mainApplicationClass))
.logStarted(this.getApplicationLog(),
stopWatch);
}
}catch(Throwable var6) { //异常处理
this.handleRunFailure(context, listeners, var6);
throw new IllegalStateException(var6);
}
}
}

createAndRefreshContext():创建应用上下文

  1. 创建环境,通知监听器
  2. 创建应用上下文,设置环境,通知监听器
  3. 加载应用上下文中需要的资源和Bean,通知监听器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
private ConfigurableApplicationContexrt createAndRefreshContext(
SpringApplicationRunListeners listeners,
ApplicationArguments applicationArguments) {

//如果没有环境,则创建
ConfigurableEnvironment environment = this.getOrCreateEnvironment();
this.configureEnvironment(environment, applicationArguments.getSourceArgs());
//通知监听器,环境准备好了
listeners.environmentPrepared(environment);
//如果是网络环境,转为标准环境
if(this.isWebEnvironment(environment) && !this.webEnvironment) {
environment = this.convertToStandardEnvironment(environment);
}
//如果开启了Banner,则打印
if(this.bannerMode != Mode.OFF) {
this.printBanner(environment);
}

//创建应用上下文
ConfigurableApplicationContext context = this.createApplicationContext();
//为应用上下文设置环境
context.setEnvironment(environment);
this.postProcessApplicationContext(context);
this.applyInitializers(context);
//通知监听器,应用上下文准备好了
listeners.contextPrepared(context);
//启动日志
if(this.logStartupInfo) {
this.logStartupInfo(context.getParent() == null);
this.logStartupProfileInfo(context);
}

//注册ApplicationArguments应用参数Bean
context.getBeanFactory().registerSingleton("SpringApplicationArguments", applicationArguments);
Set sources = this.getSources();
//断言Sources非空
Assert.notEmpty(sources, "Sources must not be empty");
//调用BeanDefinitionLoader,加载应用上下文中的资源和Bean
this.load(context,
sources.toArray(new Object[sources.size()]) );
//通知监听器,应用上下文已经加载
listeners.contextLoaded(context);
//refresh()方法,其中完成了IoC容器的创建
this.refresh(context);
//注册中断
if(this.registerShutdownHook) {
try{
context.registerShutdownHook();
}catch(AccessControlException var7){
//...
}
}

return context;
}
-------------本文结束感谢您的阅读-------------

本文标题:org.springframework.boot.SpringApplication类

文章作者:DragonBaby308

发布时间:2019年10月14日 - 19:37

最后更新:2019年10月15日 - 20:47

原始链接:http://www.dragonbaby308.com/org-springframework-boot-SpringApplication/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%