1、配置对应的dataId的refresh为True,并且使用@RefreshScope注解进行刷新
配置
spring:cloud:nacos:username: nacospassword: nacosconfig:server-addr: 127.0.0.1:8848namespace: publicfile-extension: ymlrefresh-enabled: trueshared-configs:- dataId: ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}refresh: true- dataId: common.${spring.cloud.nacos.config.file-extension}refresh: true
info:name: 123456age: 18fcant:name: fcage: 18
使用
import lombok.Data;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;/*** ConfigValue* <p>* encoding:UTF-8** @author Fcant 下午 16:47 2021/11/10/0010*/@Data@Component@ConfigurationProperties(prefix = "fcant")public class ConfigValue {@Value("${fcant.name}")private String name;@Value("${fcant.age}")private String age;}
@RestController@RequestMapping("/version")@RefreshScopepublic class VersionController {@AutowiredConfigValue configValue;@Value("${info.name}")private String name;@GetMapping("/name")public String getName() {return name + configValue.toString();}}
结果
前:123456ConfigValue(name=fc, age=18)后:wdConfigValue(name=fc, age=19)
结论
配置对应的dataId的refresh为True,并且使用@RefreshScope注解,对应的配置值和配置类的值及时的刷新了。
2、配置对应的dataId的refresh为True,但不使用@RefreshScope注解进行刷新
配置中心修改前的值
info:name: wdage: 18fcant:name: fcage: 17
配置中心修改后的值
结果

前:wdConfigValue(name=fc, age=19)后:wdConfigValue(name=fc name, age=17)
结论
不使用@RefreshScope注解,不能刷新@Value注解引用的值,但是配置类的值被更新了。
3、配置对应的dataId的refresh为False,使用@RefreshScope注解进行刷新
修改前的配置文件
info:name: wd nameage: 18fcant:name: fc nameage: 17
返回值
wd nameConfigValue(name=fc name, age=17)
修改后的配置文件
info:name: wd helloage: 18fcant:name: fc helloage: 11
返回值
wd nameConfigValue(name=fc name, age=17)
结论
不设置dataId的refresh属性为True,仅使用@RefreshScope注解无法拿到最新值。
实验表格
dataId的refresh属性值 |
是否使用@RefreshScope注解 |
配置类是否更新 | @Value注解的值是否更新 |
|---|---|---|---|
| True✅ | ✅ | ✅ | ✅ |
| True✅ | ❌ | ✅ | ❌ |
| False❌ | ✅ | ❌ | ❌ |
结论
- 当dataId的
refresh属性值为True时,会自动更新配置类的值。 - 当dataId的
refresh属性值为True时,使用@Value注解引用的值必须使用@RefreshScope注解才会自动更新。 - 当dataId的
refresh属性值为False时,任何值都不会刷新。
