小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
PropertySourceBootstrapConfiguration
PropertySourceBootstrapCofiguration是一个启动环境配置类,这类中有一个initialize方法会调用PropertySourceLocator.locate获取远程配置信息。
PropertySourceBootstrapCofiguration的初始化过程是基于自动装配来完成的,具体执行步骤如下:
- 在SpringBoot启动时,在SpringApplication.run方法中进行环境准备工作,也就是prepareEnvironment方法。
public ConfigurableApplicationContext run(String... args){
try{
ConfigurableEnvironment environment=prepareEnvironment(listeners,applicationArguments);
}catch(Throwable e){
handleRunFailure(context,e,exceptionReporters,listeners);
throw new IllegalStateException(e);
}
}
在prepareEnvironment方法中,会发布一个ApplicationEnvironmentPreparedEvent事件,对这个事件订阅的Listener都会监听到该事件的发生。
private ConfigurableEnvironment prepareEnvironmeng(SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments){
listeners.environmentPrepared(environment);
return environment;
}
BootstrapApplicationListener会受到该事件并处理,关键代码如下:
public class BootstrapApplicationListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent>,Ordered{
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event){
context = this.bootstrapServiceContext(environment,event.getSpringApplication(),configName);
}
private ConfigurableApplicationContext bootstrapServiceContext(ConfigurableEnvironment environment,SpringApplication application,String configName){
builder.sources(new Class[]{BootstrapImportSelectorConfiguration.class});
}
}
BootstrapImportSelectorConfiguration是一个配置类,该配置类用@Import导入了一个BootstrapImportSelector来实现自动装配过程。
@Configuration
@Import
public class BootstrapImportSelectorConfiguration{
public BootstrapImportSelectorConfiguration(){
}
}
在BootstrapImportSelector类的selectImports方法中,看Spring中SPI机制,到classpath路径下查找META-INF/spring.factories预定义的一些扩展点
public String[] selectImports(AnnotationMetadata annotationMetadata){
List<String> names = new ArrayList(SpringFactoriesLoader.loadFactoryNames(BootstrapConfiguration.class,classLoader))
}
在spring-cloud-alibaba-nacos-config.jar和spring-cloud-context.jar的spring.factories的文件看到如下配置:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration,
\org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration,
\org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguartion,\org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguation
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration
可看到有两个配置类:PropertySourceBootstrapConfiguration和NacosConfigBootstrapConfiguration