SpringApplication生命周期
1.获取SpringApplicationRunListener
>通过SPI机制加载SpringApplicationRunListener实现类,定义在META-INF/spring.factories
# Run Listeners
org.springframework.boot.SpringApplicationRunListener=org.springframework.boot.context.event.EventPublishingRunListener
2.遍历所有的SpringApplicationRunListener并调用starting()方法
默认EventPublishingRunListener发布ApplicationStartingEvent事件
3.将JVM启动参数封装为ApplicationArguments
4.准备environment抽象
-
创建environment
-
SERVLET
: StandardServletEnvironment -
REACTIVE
:StandardReactiveWebEnvironment -
default
:StandardEnvironment
-
-
配置Environment
- 增加
conversionService
- 添加命令参数
- 配置profile
- 增加
-
发布
ApplicationEnvironmentPreparedEvent
ConfigFileApplicationListener#onApplicationEnvironmentPreparedEvent --> EnvironmentPostProcessor#postProcessEnvironment
5.实例化ApplicationContext
web应用类型推断
- 传统web容器
servlet
:AnnotationConfigServletWebServerApplicationContext - 基于netty的
reactive
:AnnotationConfigReactiveWebServerApplicationContext - 非web应用
default
:AnnotationConfigApplicationContext
6.准备应用上下文
- 设置enviroment
- 对应用上下文的前置处理
- 自定义beanName生成器<默认无>
- 自定义资源加载器<默认无>
- 添加类型转换器
ConversionService
-
ApplicationContextInitializer
:在容器refresh()之前初始化容器,通常用于注册Property sources - 发布
ApplicationContextInitializedEvent
事件 - 向容器注册
ApplicationArguments
单例bean - 设置beanDefinition是否可以覆盖,这里会设置为false,低版本的springboot未做设置
- 加载配置源,默认由@SpringApplication标注的类,需要注意的是配置源是可以存在多份的
- 向容器注册配置源类的beanDefinition
- 发布
ApplicationPreparedEvent
事件 - refresh容器
- 容器启动完成后,发布
ApplicationStartedEvent
事件
总结
Springboot通过在容器真正启动前,提前对容器的行为做出相应的调整。并自定义了Spring应用上下文事件
SpringApplicationEvent