一、 SpringBoot启动过程小结
1、创建SpringApplication,准备引导器、初始化器和应用监听器
2、运行SpringApplication
2.1获取运行监听器。这个监听器在启动过程中会一直监听各种事件,如准备环境完成,容器完成,异常等等
2.2准备环境
2.3 容器创建
2.4 准备容器基本信息
2.5 刷新容器(spring启动原理,核心是创建所有单实例bean,详情见Spring1–IOC)
2.6 运行监听器.start
2.7 Runner.run
2.8 运行监听器.run(或者过程中异常就.failed)
二、流程详解
1、创建 SpringApplication
1) 保存一些信息。
2) 判定当前应用的类型。ClassUtils。Servlet|或者是响应式WebFlux
3) bootstrappers:初始启动引导器(List):去spring.factories文件中找 org.springframework.boot.Bootstrapper
4) 找 ApplicationContextInitializer;去spring.factories找 ApplicationContextInitializer
——List<ApplicationContextInitializer<?>> initializers
5)找 ApplicationListener ;应用监听器。去spring.factories找 ApplicationListener
——List<ApplicationListener<?>> listeners
2、 运行 SpringApplication
1) StopWatch
2) 记录应用的启动时间
3) 创建引导上下文(Context环境)createBootstrapContext()
——获取到所有之前的 bootstrappers 挨个执行 intitialize() 来完成对引导启动器上下文环境设置
4) 让当前应用进入headless模式。java.awt.headless
5) 获取所有 RunListener(运行监听器)【为了方便所有Listener进行事件感知】
——getSpringFactoriesInstances 去spring.factories找 SpringApplicationRunListener.
6) 遍历 SpringApplicationRunListener 调用 starting 方法; 通知所有感兴趣系统正在启动过程的人,项目正在 starting。
7) 保存命令行参数;ApplicationArguments
8) 准备环境 prepareEnvironment();
) 返回或者创建基础环境信息对象。StandardServletEnvironment
) 配置环境信息对象。
) 读取所有的配置源的配置属性值。
) 绑定环境信息
) 监听器调用 listener.environmentPrepared();通知所有的监听器当前环境准备完成
9) 创建IOC容器(createApplicationContext())
1) 根据项目类型(Servlet)创建容器,
2) 当前会创建 AnnotationConfigServletWebServerApplicationContext
10) 准备ApplicationContext IOC容器的基本信息 prepareContext()
1) 保存环境信息
2) IOC容器的后置处理流程。
3) 应用初始化器;applyInitializers;
~ 遍历所有的 ApplicationContextInitializer 。调用 initialize.。来对ioc容器进行初始化扩展功能
~ 遍历所有的 listener 调用 contextPrepared。EventPublishRunListenr;通知所有的监听器contextPrepared
~ 所有的监听器 调用 contextLoaded。通知所有的监听器 contextLoaded;
11) 刷新IOC容器。refreshContext: 创建容器中的所有组件(Spring注解)
12) 容器刷新完成后工作?afterRefresh
13) 所有监听器 调用 listeners.started(context); 通知所有的监听器 started
14) 调用所有runners;callRunners()
1) 获取容器中的 ApplicationRunner
2) 获取容器中的 CommandLineRunner
3) 合并所有runner并且按照@Order进行排序
4) 遍历所有的runner。调用 run 方法
15) 如果以上有异常, 调用Listener 的 failed
16) 调用所有监听器的 running 方法
3、自定义启动过程时的组件(初始化器、监听器、运行器)
https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-application-events-and-listeners https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-application-events-and-listeners
ApplicationContextInitializer
ApplicationListener
SpringApplicationRunListener
ApplicationRunner 与 CommandLineRunner:在应用启动时做一些一次性的事情。
以上组件都可以自定义实现,在boot启动过程中会运行对应方法
这里标蓝色的必须通过SPI方式才能生效,即在META-INF下的配置文件中进行配置