SpringBoot-启动流程
创建SpringApplication


1. 保存了一些主要资源信息,primarySoruce
2. ClassUtils
- 用此工具类判断应用类型,比如:响应式应用类型、原生servlet应用类型、NONE
 

3. bootstrappers
- 初始启动引导器(List<Bootstrapper>)
 - 去spring.factories文件中找 org.springframework.boot.Bootstrapper
 
4. ApplicationContextInitializer
- 应用上下文初始化器
 - 去spring.factories找 ApplicationContextInitializer
 
5. ApplicationListener
- 应用监听器
 - 去spring.factories找 ApplicationListener
 

运行SpringApplication

1. StopWatch
- 监听整个应用程序启动停止的监听器
 - 记录了应用的启动时间
 
2. 创建引导上下文(Context环境)createBootstrapContext()
- 获取到所有之前的 bootstrappers 循环执行 intitialize() 来完成对引导启动器上下文环境设置
 

3. 让当前应用进入headless模式
- java.awt.headless
 - 自力更生模式
 

4. 获取所有 RunListener(运行监听器)【为了方便所有Listener进行事件感知】
- getSpringFactoriesInstances 去spring.factories找 SpringApplicationRunListener
 

5. 遍历 SpringApplicationRunListener 调用 starting 方法


6. 保存命令行参数ApplicationArguments
- 例如:java -jar xx.jar --server.port=8888,server.prot=8888就会存入ApplicationArguments中
 
7. 准备环境 prepareEnvironment()

- 返回或者创建基础环境信息对象。StandardServletEnvironment
 

- 配置环境信息对象。读取所有的配置源的配置属性值
 

- 绑定环境信息
 - 监听器调用 listener.environmentPrepared():通知所有的监听器当前环境准备完成
 

8. 创建IOC容器(createApplicationContext())
- 根据项目类型(Servlet)创建容器
 - 当前会创建 AnnotationConfigServletWebServerApplicationContext
 


9. 准备ApplicationContext IOC容器的基本信息 prepareContext()

- 保存环境信息
 - IOC容器的后置处理流程
 - 应用初始化器applyInitializers,遍历所有的 ApplicationContextInitializer ,调用 initialize()来对ioc容器进行初始化扩展功能
 

- 遍历所有的 listener 调用 contextPrepared。EventPublishRunListenr;通知所有的监听器contextPrepared
 


- 所有的监听器调用 contextLoaded
 

10. 刷新IOC容器refreshContext,创建容器中的所有组件
- spring的核心方法,实际调用的是AbstractApplicationContext.refresh()方法
 
11. 容器刷新完成后工作afterRefresh
12. 所有监听器调用 listeners.started(context),通知所有的监听器 started
13. 调用所有runners;callRunners()
- 获取容器中的 ApplicationRunner
 - 获取容器中的 CommandLineRunner
 - 合并所有runner并且按照@Order进行排序
 - 遍历所有的runner。调用 run 方法
 - 执行一次数据初始化操作等
 

13. 如果以上有异常,调用Listener 的 failed

14. 调用所有监听器的 running 方法 listeners.running(context),通知所有的监听器 running
15. running如果有问题,处理异常,Listener 参数传的是null,所以不会执行failed
自定义相关组件
- 自定义组件
 
public class MyApplicationContextInitializer implements ApplicationContextInitializer {}public class MyApplicationListener implements ApplicationListener {}public class MyApplicationRunner implements ApplicationRunner {}public class MyCommandLineRunner implements CommandLineRunner {}public class MySpringApplicationRunListener implements SpringApplicationRunListener {}- META-INF\spring.factories
 
org.springframework.context.ApplicationContextInitializer=\com.my.boot.listener.MyApplicationContextInitializerorg.springframework.context.ApplicationListener=\com.my.boot.listener.MyApplicationListenerorg.springframework.boot.SpringApplicationRunListener=\com.my.boot.listener.MySpringApplicationRunListener