1. 前言
本文基于Spring Cloud Version:
Spring Cloud Hoxton.SR8
,Spring Boot Version:2.3.2.RELEASE
,Nacos Version:1.3.3
在sprig boot 中,引入nacos-config-spring-boot-starter
后,通常是使用@NacosValue
注解来获取nacos server 中的配置以及自动刷新,官网中的实例如下:
@Controller
@RequestMapping("config")
public class ConfigController {
@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public boolean get() {
return useLocalCache;
}
}
在spring cloud alibaba中,引入spring-cloud-starter-alibaba-nacos-config
则使用了更优雅的方式支持spring 原生注解@Value来获取参数,通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新,官网中的实例如下:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
spring-cloud-starter-alibaba-nacos-config
是把nacos server所有的配置都放在Environment中,下面简要分析一下源码看看是怎么整合
2. spring cloud alibaba 初始化将参数配置追加到Environment
spring cloud alibaba是借助PropertySourceBootstrapConfiguration这个ApplicationContextInitializer,通过自定义类实现PropertySourceLocator接口来扩展,其原理详见《spring cloud 中Environment自定义扩展配置源码简析和实例》。
在NacosConfigBootstrapConfiguration
中创建了NacosConfigManager
、NacosPropertySourceLocator
两个关键类:
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)
public class NacosConfigBootstrapConfiguration {
@Bean
@ConditionalOnMissingBean
public NacosConfigProperties nacosConfigProperties() {
return new NacosConfigProperties();
}
@Bean
@ConditionalOnMissingBean
public NacosConfigManager nacosConfigManager(
NacosConfigProperties nacosConfigProperties) {
return new NacosConfigManager(nacosConfigProperties);
}
@Bean
public NacosPropertySourceLocator nacosPropertySourceLocator(
NacosConfigManager nacosConfigManager) {
return new NacosPropertySourceLocator(nacosConfigManager);
}
}
jar中springfactory.properties的配置:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration
NacosPropertySourceLocator的主要源码如下:
public class NacosPropertySourceLocator implements PropertySourceLocator {
@Override
public PropertySource<?> locate(<