SpringBoot启动我总结一下分为三个阶段 1.启动前 2.启动 3.启动后
启动前
- 推断应用类型 ,判断是web应用还是非web应用,是servlet应用还是webflux应用。
- SpringFactoriesLoader加载META-INF/spring.factories的配置文件,并加载
ApplicationContextInitializer
和ApplicationListener
的实现类。
启动
- 启动计时器并注册shutdownhook钩子,创建一个
BootstrapContext
用于接收配置中心的远程配置,发布第一个事件:ApplicationStartingEvent
。- 加载配置环境
Environment
- 这一步会加载所有的配置属性,如
application.properties/yaml
、命令行参数、BootstrapContext
的远程配置等。完成后会发布ApplicationEnvironmentPreparedEvent
事件。
- 根据推断出的应用类型创建对应的
ApplicationContext
- PrepareContext准备上下文
- 将
Environment
关联到ApplicationContext
- 遍历并调用所有
ApplicationContextInitializer
的initialize
方法
- 将启动类作为主配置类注册(
@SpringBootConfiguration
)
- 发布
ApplicationContextInitializedEvent
和ApplicationPreparedEvent
事件
- RefreshContext刷新上下文(包含启动完整的Bean生命周期)
- 执行BeanFactoryPostProcessor,其中子类
ConfigurationClassPostProcessor
会去解析注册的主配置类,发现了@EnableAutoConfiguration
注解就会调用导入的AutoConfigurationImportSelector
,这个类会去加载META-INF/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件,并根据@ConditionalOnXXX
注解判断是否加载,最终注册成BeanDefinition
- 注册BeanPostProcessor,创建内嵌的Web服务器,然后实例化所有的
BeanDefinition
(bean的生命周期)
- bean实例化
- 设置bean的对象属性
- 执行Aware接口(BeanNameAware, BeanFactoryAware)
- BeanPostProcessor前置处理
- InitializingBean的afterPropertiesSet方法
- 自定义的init方法
- BeanPostProcessor后置处理
- 注册bean的销毁回调钩子
到此bean的初始化完成,可以使用了。
启动后
- 调用
ApplicationRunner
和CommandLineRunner
的run方法,并最终发布ApplicationReadyEvent
至此容器启动成功