1. 前言
本文基于Spring Cloud Version:Spring Cloud Hoxton.SR8,Spring Boot Version:2.3.2.RELEASE
在spring boot中Environment
的扩展配置可借助ConfigFileApplicationListener
这个ApplicationListener
,通过自定义类实现EnvironmentPostProcessor
接口来扩展,详细介绍可以我之前的文章《spring boot参数配置之Environment源码分析》、《spring boot参数配置之Environment扩展》.
在spring cloud中Environment
的扩展配置还可以借助PropertySourceBootstrapConfiguration
这个ApplicationContextInitializer
,通过自定义类实现PropertySourceLocator
接口来扩展。
2. spring cloud 启动处理Environment源码分析
2.1. spring cloud 启动ApplicationContext两阶段创建
在spring cloud中启动时SpringApplication.run(String... args)
会执行两次,也就是说ApplicationContext
会分为两阶段来创建。
-
第一次执行run(阶段一):阶段一执行会只会加载
bootstrap.yml
里配置的参数以及创建spring.factories
中org.springframework.cloud.bootstrap.BootstrapConfiguration
里配置的类,这些类往往是一些跟配置相关的类,这一阶段创建的类优先级很高,主要为阶段二ApplicationContext
里需要创建的类提供一些准备。
可以看看spring-cloud-context-2.2.5.RELEASE.jar
里的spring.factories
中# Bootstrap components
相关配置 -
第二次执行run(阶段二):阶段二执行会加载剩余所有的参数以及创建所有的bea对象,主要是通过@ComponentScan可以扫描到的、xml里配置的bean、以及通过
@EnableAutoConfiguration
加载spring.factories
里的org.springframework.boot.autoconfigure.EnableAutoConfiguration
的相关配置
可以看看 spring-cloud-context-2.2.5.RELEASE.jar
里的spring.factories
中# AutoConfiguration
相关配置
# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.cloud.autoconfigure.LifecycleMvcEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.WritableEnvironmentEndpointAutoConfiguration
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.cloud.bootstrap.BootstrapApplicationListener,\
org.springframework.cloud.bootstrap.LoggingSystemShutdownListener,\
org.springframework.cloud.context.restart.RestartListener
# Bootstrap components
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration,\
org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration,\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.cloud.util.random.CachedRandomPropertySourceAutoConfiguration
2.2. spring cloud 启动参数相关源码分析
主线:PropertySourceBootstrapConfiguration的initialize(…)->PropertySourceLocator.locate()
核心源码如下:
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection