小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
PropertySourceLocator
接着开始进行配置加载,回到启动类的run方法,调用PropertySourceContext
public configurableApplicationContext run(String... args){
prepareContext(context,environment,listeners,applicationArguments,printedBanner);
}
prepareContext 刷新应用上下文的准备阶段,然后调用applyInitializers
private void prepareContext(ConfigurableApplication context,ConfigurableEnvironment environment,SpringApplicationListeners,ApplicationArguments applicationArguments,Banner printedBanner){
applyInitializers(context);
}
applyInitializers方法主要执行容器中的ApplicationContextInitializer,它的作用是在应用上下文初始化时做一系列操作。
protect void applyInitializers(ConfigurableApplicationContext context){
for(ApplicationContextInitializer initializer:getInitializers()){
Class<?> type = GenericTypeResolver.resolveTypeArgument(initializer.getClass(),ApplicationContextInitializer.class);
Assert.isInstanceOf(type,context,"unable to initializer!");
initializer.initialize(context);
}
}
PropertySourceBootstrapConfiguration 实现ApplicationContextInitializer接口,在applyInitializers方法调用initialize方法,最后调用PropertySourceBootstrapConfiguration中的initialize方法。
public void initialize(ConfigurableApplicationContext applicationContext){
Iterator iterator = this.propertySourceLocators.iterator();
while(iterator.hasNext()){
PropertySourceLocator propertySourceLocator =(PropertySourceLocator)iterator.next();
PropertySource<?> source= propertySourceLocator.locate(environment);
}
}
PropertySourceLocator 接口作用是实现应用外部化配置可动态加载,而NacosPropertySourceLocator实现了这个接口,locator.locate调用的是NacosPropertySourceLocator的locate方法。
在NacosPropertySourceLocator的locate方法中将存放在NacosServer中的配置信息读取,把相关的配置信息存到PropertySource实例并返回。
深入 Nacos Config 核心源码
Spring Cloud Alibaba Nacos Config 中通过Context.getEnvironment.getProperty("Key")获取Nacos Config服务器上的数据,重点的实现类是NacosPropertySourceLocator,方法中包含locate(),
它的作用:
- 初始化ConfigService对象,它是Nacos客户端提供的用于访问实现配置中心基本操作的类。
- 加载配置、扩展配置、应用名称对应的配置
public PropertySource<?> locate(Environment environment){
ConfigService configService=nacosConfigProperties.configServiceInstance();
nacosPropertySourceBuilder=new NacosPropertyBuilder(ConfigService,timeout);
loadSharedConfiguration(composite);
loadExtConfiguration(composite);
loadApplicationConfiguration(composite,dataIdPrefix,nacosCOnfigProperties,environment);
}
接着查看loadApplicationConfiguration方法深入
private Properties loadNacosData(String dataId,String group,String fileExtension){
String data = null;
try{
data = configService.getConfig(dataId,group,timeout);
Properties properties=NacosDataParserHandler.getInstance().parseNacosData(data,fileExtension);
return properties == null? EMPTY_PROPERTIES:properties;
}
return EMPTY_PROPERTIES;
}