springboot SpringApplication的初始化

源于 framework,应用运行生命周期主要包括以下阶段:

1.SpringApplication初始化阶段;

2.SpringApplication运行阶段;

3. Boot应用退出。

这里先简述一下的启动初始化阶段。初始化阶段属于运行前的准备阶段,大多数springboot应用直接或间接地使用SpringApplication API 驱动 应用, SpringApplication允许指定应用的类型,主要包括Web应用和非Web应用。从Springboot2.0开始,Web应用可分为Servlet Web和Reactive Web。SpringApplication的初始化准备主要包括两阶段:构造 和 配置。

SpringApplication构造阶段

构造阶段由其构造器完成,这也是个Java类。日常开发中使用的是run静态方法启动应用,而不是直接调用其构造方法。

image

通过工具,在SpringApplication的中,可以看到run方法调用了他的构造器:

image

在SpringApplication源码中的开始部分可以找到两个构造器实现,run方法默认调用是第一个,而第一个构造器会调用第二个构造实现:

image

根据以上方法间的调用关系,SpringApplication.run(SpringApplicationConfiguration.class, args) 等价于new SpringApplication(new Class[] {SpringApplicationConfiguration.class}).run(args)。

SpringApplication主配置类的概念和实现是从 Boot2.0开始引入的。一般地引导类就是主配置类,并作为primarySources参数的值传入上面的构造器,引导类就是标注了@EnableAutoConfiguration注解或者标注了@SpringBootApplication注解,由于后者元标注了@EnableAutoConfiguration,因此两者均被底层应用上下文以@EnableAutoConfiguration处理。这个可以通过写个测试程序,然后取消@EnableAutoConfiguration注解来检验(日志会提示你未注册的组件)。换句话说,构造器的primarySources参数实际上是Spring Boot应用上下文的Configuration 类,该配置类也可以不是引导类的独立配置类,只是被引导类调起,至于引导类就是配置类,纯属简化操作。从Java类的视角重新审视SpringApplication类,可以发现主配置类属性primarySources还可以通过SpringApplication#addPrimarySources(Collection)方法设置:

image

 

以上主要陈述了一个事实:springboot应用引导类通过调用SpringApplication类的run方法调起其构造方法,这两个呆萌的构造方法上上图可见。前面已经表过,真正干事的是第二个构造方法,仔细观察其实现可以发现主要包括5个事:保存主配置类primarySources到其属性的内存中、推断Web应用类型、加载Spring应用上下文初始化器、加载Spring应用事件监听器和推断应用引导类。如下图所示,五句金玉良言:

image

 

那么下面,就从这五句金玉良言展开探探底。

第一句不做赘述,前面已讲就是存储主配置类primarySources到当前对象的属性中去。第二句是:

this.webApplicationType = this.deduceWebApplicationType(); // 推断Web应用类型
 

 

未完待续……

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《springboot SpringApplication的初始化
本文地址:https://www.zhiletu.com/archives-10007.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微