1. 执行main方法,运行SpringApplication.run();
2. 执行run方法前new 一个SpringApplication对象,这个对象的构造函数做了如下操作
a. 确定应用程序的类型(NONE SERVLET REACTIVE)
-
SERVLET:
- 当将 WebApplicationType 设置为 SERVLET 时,表示应用程序是一个传统的基于 Servlet 的 Web 应用程序。
- 这种类型适用于使用传统的 Servlet 编程模型来处理 Web 请求和构建 Web 应用程序的情况。
-
REACTIVE:
- 当将 WebApplicationType 设置为 REACTIVE 时,表示应用程序是一个响应式的 Web 应用程序,支持响应式编程模型和 WebFlux。
- 这种类型适用于构建基于响应式编程范例的 Web 应用程序,可以处理高并发、非阻塞的请求。
-
NONE:
- 在之前的回答中提到的 NONE 选项是一个误解,实际上 Spring Boot 中并没有 WebApplicationType.NONE 这个选项。正确的选项包括 SERVLET 和 REACTIVE 两种。
b. 加载所有的初始化器(ApplicationContextInitializer) 和监听器(ApplicationListener)
通过springboot 和springboot-autoconfigure spring.factories
c. 确定应用程序主类(main方法所在的类),以边后续扫描包使用
3. 运行run方法(进入了run方法的主体)
a. 计时器(计算程序启动开始时间)
b. 设置headLess==true,--运行在服务器端,在没有显示器器和鼠标键盘的模式下照样可以工作,模拟输入输出设备功能(设置该应用程序,即使没有检测到显示器,也允许其启动.)
c. 创建并启动应用监听器 SpringApplicationRunlisteners
d. 设置应用程序参数,即main方法的args
e. 加载springboot配置环境,包含jdk、maven等所需要的系统环境 并且加入到监听器中
f. 创建加载程序应用上下文 ConfigurableApplicationContext
g. 创建spring容器 实现自动化配置及bean实例化等操作
h. 计时结束,发布上下文准备就绪事件,运行结束