1.保存一些必要的初始化信息(主配置类)
2.判断当前应用类型(响应式/servlet)
3.获取初始启动引导器bootstrappers,去spring.factories文件中找bootstrapper
4.获取 应用上下文初始化器ApplicationContextInitializer,去spring.factories找 initializers
5.获取 应用监听器ApplicationListener,去spring.factories 找 listeners
1.创建StopWatch(停止监听器),记录了应用的启动时间
2.创建引导上下文(Context环境):createBootstrapContext(),获取到所有之前的 bootstrappers 挨个执行 intitialize() 来完成对引导启动器上下文环境设置
3.让当前应用进入headless模式(简单说是自力更生模式)。java.awt.headless
4.获取所有运行监听器 RunListener【为了方便所有Listener进行事件感知】,要去spring.factories找 SpringApplicationRunListener.
5.遍历 SpringApplicationRunListener 调用 starting 方法;相当于通知所有对系统正在启动过程感兴趣的人项目开始启动。
6.保存命令行参数;ApplicationArguments
7.准备环境 prepareEnvironment();
7.1 返回或者创建基础环境信息对象StandardServletEnvironment
7.2 配置环境信息对象,读取所有的配置源的配置属性值
7.3 绑定环境信息
7.4 监听器调用 environmentPrepared();通知所有监听器当前环境准备完成
8.创建IOC容器(createApplicationContext)
8.1 根据项目类型(Servlet)创建容器,
8.2 创建 AnnotationConfigServletWebServerApplicationContext
9.准备IOC容器的基本信息(prepareContext)
9.1 保存环境信息
9.2 IOC容器的后置处理流程。
9.3 应用初始化器-applyInitializers;
9.3.1 遍历所有ApplicationContextInitializer 。对ioc容器进行初始化扩展
9.3.2 遍历所有 listener 调用 contextPrepared。通知所有的监听器上下文准备好
9.4 所有的监听器调用 contextLoaded。通知所有的监听器上下文加载好
10.刷新IOC容器(refreshContext)-创建容器中的所有组件(Spring注解)
11.所有监听器调用 started(context); 通知所有的监听器项目启动了
12.调用所有runners(如果以上有异常,调用Listener 的 failed(),通知所有监听器 启动失败)
12.1 获取容器中的 ApplicationRunner 、 CommandLineRunner
12.2 合并所有runner并且按照@Order进行排序
12.3 遍历所有runner,调用 run 方法调用所有监听器的 running 方法
13.listeners.running(context); 通知所有的监听器 项目已经启动完成(running如果有问题,调用所有 Listener 的 failed(),通知所有监听器 启动失败)