在继续分析SpringCloud实现动态配置的源码之前,需要补充一些SpringBoot和SpringCloud的基础知识才能继续阅读。在本文中,我们将学习SpringBoot和SpringCloud应用的启动过程。SpringBoot应用启动流程当我们在SpringBoot项目中调用SpringApplication的run方法启动应用时,SpringBoot应用启动流程大致可以分为三个粗粒度的步骤。第一步:准备环境Environment。这时会发送一个ApplicationEnvironmentPreparedEvent事件(应用环境准备事件),同步消费该事件。当事件监听器全部调用完毕后,SpringBoot继续完成环境Environment的准备,加载application.yaml和所有ActiveProfiles对应的application-[activeProfile].yaml配置文件。第2步:准备ApplicationContext容器。此时读取我们在spring.factories文件中配置的EnableAutoConfiguration,根据配置的类名加载类,为类生成BeanDefinition并注册到bean工厂中。第3步:一切就绪后刷新ApplicationContext。SpringBoot启动流程如下图所示。SpringCloud应用启动流程SpringCloud项目可以在spring.factories配置文件中配置一个BootstrapConfiguration类,它与SpringBoot提供的EnableAutoConfiguration类没有区别,只是作用于不同的ApplicationContext容器。当项目中添加了SpringCloud依赖后,SpringApplication的run方法会启动两个容器,即两个ApplicationContext。原来的应用程序启动过程也发生了变化。SpringCloud的BootstrapApplicationListener监听ApplicationEnvironmentPreparedEvent事件,监听到事件时开启一个新的ApplicationContext容器。我们可以把这个ApplicationContext容器叫做SpringCloud的Bootstrap容器。Bootstrap容器用于注册spring.factories配置文件中配置的所有BootstrapConfiguration,并且在Bootstrap容器初始化后,其Bean工厂作为SpringBoot原本启动的ApplicationContext容器的Bean工厂的父工厂,如如下图所示。这个SpringCloud层的Bootstrap容器好像是SpringCloud特有的为动态配置量身定做的。SpringCloud的启动流程如下图所示。SpringCloud为应用创建了一个Bootstrap容器,也走完了SpringBoot应用的启动过程。在原来的main方法中,调用SpringApplication的run方法启动ApplicationContext容器会卡在环境准备阶段,等待SpringCloud为其提供父工厂。BootstrapApplicationListener监听ApplicationEnvironmentPreparedEvent事件,准备启动Bootstrap容器时,bootstrap.[yaml|props]配置文件被读取并写入到Bootstrap容器的Environment中。BootstrapApplicationListener通过判断Environment中是否有BootstrapPropertySource来区分当前容器是否为Bootstrap容器,从而通过无限监听ApplicationEnvironmentPreparedEvent事件来解决启动新容器的问题。本文转载自微信公众号“爪哇艺术”,可通过以下二维码关注。转载本文请联系爪哇艺术公众号。
