SpringCloud 实现配置加载源码分析

209 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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