Spring Cloud
与Kubernetes
系列文章已经更新到第十五篇,而源码分析类的文章笔者是默认大家都已经对Spring
的源码所有了解了,至少什么工厂Bean
、后置处理器BeanPostProcessor
、Bean
的生命周期、Spring
容器的启动流程等都有所了解。
在继续分析Spring Cloud
实现动态配置的源码之前,我们需要补充一些Spring Boot
和Spring Cloud
的基础知识才能继续往下看。本篇我们一起学习Spring Boot
与Spring Cloud
应用的启动流程。
SpringBoot应用启动流程
当我们在Spring Boot
项目中调用SpringApplication
的run
方法启动应用时,Spring Boot
应用启动流程粗粒度可划分为三个步骤。
第一步:准备环境Environment
。此时会发送一个ApplicationEnvironmentPreparedEvent
事件(应用环境准备事件),事件是同步消费的。当事件监听器都被调用完后,Spring Boot
继续完成环境Environment
的准备工作,加载application.yaml
以及所有的ActiveProfiles
对应的application-[activeProfile].yaml
配置文件。
第二步:准备ApplicationContext
容器。我们在spring.factories
文件中配置的EnableAutoConfiguration
就是在此时被读取的,并且根据配置的类名加载类,为类生成BeanDefinition
注册到bean
工厂中。
第三步:一切准备就绪后再刷新ApplicationContext
。
Spring Boot
启动流程如下图所示。
Spring Cloud应用启动流程
Spring Cloud
项目可以在spring.factories
配置文件中配置一种BootstrapConfiguration
类,这与Spring Boot
提供的EnableAutoConfiguration
类并没有什么区别,只是它们作用在不同的ApplicationContext
容器中。
当项目中添加Spring Cloud
的依赖时,SpringApplication
的run
方法启动的就会是两个容器,即两个ApplicationContext
。原本的应用启动流程也有所变化。
Spring Cloud
的BootstrapApplicationListener
监听ApplicationEnvironmentPreparedEvent
事件,在监听到事件时开启一个新的ApplicationContext
容器,我们可以称这个ApplicationContext
容器为Spring Cloud
的Bootstrap
容器。
Bootstrap
容器被用来注册spring.factories
配置文件中配置的所有BootstrapConfiguration
,并在Bootstrap
容器初始化完成后将其Bean
工厂作为原本Spring Boot
启动的ApplicationContext
容器的Bean
工厂的父工厂,如下图所示。
这个Spring Cloud
层的Bootstrap
容器似乎是Spring Cloud
特定为实现动态配置量身定做的。
Spring Cloud
的启动流程如下图所示。
Spring Cloud
创建为应用启动一个Bootstrap
容器也会走一遍Spring Boot
应用的启动流程。而原来main
方法中调用SpringApplication
的run
方法启动ApplicationContext
容器则会卡在环境准备阶段,等待Spring Cloud
为其提供父工厂。
bootstrap.[yaml|props]
配置文件在BootstrapApplicationListener
监听到ApplicationEnvironmentPreparedEvent
事件时,准备启动Bootstrap
容器之前读取,并写入到Bootstrap
容器的Environment
。
BootstrapApplicationListener
通过判断Environment
中是否存在bootstrap
这个PropertySource
辨别当前容器是否是Bootstrap
容器,以解决无限监听到ApplicationEnvironmentPreparedEvent
事件启动新容器的问题。
https://mp.weixin.qq.com/s/j2LiHy1vNTsFBUpjbVFYOQ