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至此容器启动成功
