1、配置对应的dataId的refresh为True,并且使用@RefreshScope
注解进行刷新
配置
spring:
cloud:
nacos:
username: nacos
password: nacos
config:
server-addr: 127.0.0.1:8848
namespace: public
file-extension: yml
refresh-enabled: true
shared-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: 123456
age: 18
fcant:
name: fc
age: 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")
@RefreshScope
public class VersionController {
@Autowired
ConfigValue 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: wd
age: 18
fcant:
name: fc
age: 17
配置中心修改后的值
结果
前:wdConfigValue(name=fc, age=19)
后:wdConfigValue(name=fc name, age=17)
结论
不使用@RefreshScope
注解,不能刷新@Value
注解引用的值,但是配置类的值被更新了。
3、配置对应的dataId的refresh为False,使用@RefreshScope
注解进行刷新
修改前的配置文件
info:
name: wd name
age: 18
fcant:
name: fc name
age: 17
返回值
wd nameConfigValue(name=fc name, age=17)
修改后的配置文件
info:
name: wd hello
age: 18
fcant:
name: fc hello
age: 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时,任何值都不会刷新。