SpringApplication.run();
方法
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
运行了一个main()
方法,实际上是开启了一个服务;
SpringApplication.run()
方法又执行了一个run
,SpringApplication
的构造方法有几个点,设置属性的路径,处理路径的bean、设置监听器,设计初期化执行的 方法;
核心点在于构造器的几个方法:
主要点在于设置资源加载器、设置主配置类、获取application的类型,详细逐步打断点看
this.properties.setWebApplicationType(WebApplicationType.deduceFromClasspath());
根据关键字获取设置当前 SpringApplication 的类型this.setInitializers
设置初始化器。this.setListeners
设置监听器。this.mainApplicationClass = this.deduceMainApplicationClass();
设置主类。
引导启动器、初始化器、监听器的加载过程是一样的,经过
getSpringFactoriesInstances()
遍历查找之后,在进行配置进去;
参照学习:
spring boot 启动过程(一):创建 SpringApplication 对象_java创建一个springboot application-CSDN博客
spring boot 启动过程(二)run()方法_springbootrun方法做了什么-CSDN博客
图例:
狂神说的图例:
根据step看相关的流程:
- 创建一个
SpringApplication()
对象,创建对象是 加载init
的初期化方法- 推断应用类型
- 加载所有可用的初期化器
- 设置所有的监听器
- 推断并设置main方法的定义类
- 实例化对象,执行
run()
方法- 应用init的实例,应用监听器监听
- 初始化监听器
- 启动监听器
- 启动监听器
- 装配环境参数
- 创建配置环境
- 加载属性资源
- 加入预监听集合 ??
- 加载打印banner.txt
- 准备上下文报告器,通过传入的类名,使用类加载器获取全路径,使用反射得到class对象生成实例再返回。
- 上下文前置处理
- 监听
- env环境设置
- 资源获取
- 执行上下文区域
- 根据类型创建上下文
- Web/Standard
- Web类型:一直在执行
- Standard类型:执行一次就关闭
- 上下文刷新
- bean工厂加载
- 生产bean
- 刷新生命周期
- 上下文后置处理
1. 计时器结束
2. 监听结束 - 发布应用上下文启动完成
- 执行Runner运行器
- 发布应用上下文就绪并返回
- SpringApplication启动
总结
结合资料学习了解,SpringApplication这个类主要做四件事
- 推断 这个Spring的项目是Web项目还是标准项目(Standard);
- 查找 并 加载 所有可用初始化器,设置到
<font style="color:rgba(0, 0, 0, 0.9);">initializers</font>
中; - 找出所有的应用监听器,设置到
<font style="color:rgba(0, 0, 0, 0.9);">listeners</font>
中; - 推断并设置main方法的定义类,找到运行的主类;