Nacos修改配置,数据不刷新问题

问题描述:

nacos修改了配置,但是@Value没有动态刷新

解决办法:

在使用Nacos作为配置中心时,除了@NacosValue可以做到自动刷新外,nacos-spring-context:0.3.4版本是支持@Value获取Nacos配置中心的值,并动态刷新的,该功能是Spri依靠ngValueAnnotationBeanPostProcessor类来实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
    protected Tuple<String, NacosValueTarget> doWithAnnotation(String beanName,
            Object bean, Value annotation, int modifiers, Method method, Field field) {
        if (annotation != null) {
            if (Modifier.isStatic(modifiers)) {
                return Tuple.empty();
            }
  
            if (bean.getClass().isAnnotationPresent(NacosRefresh.class)) {
                String placeholder = resolvePlaceholder(annotation.value());
  
                if (placeholder == null) {
                    return Tuple.empty();
                }
  
                NacosValueTarget nacosValueTarget = new NacosValueTarget(bean, beanName,
                        method, field);
                nacosValueTarget.setAnnotationType(getAnnotationType().getSimpleName());
                logger.debug("@Value register auto refresh");
                return Tuple.of(placeholder, nacosValueTarget);
            }
        }
        return Tuple.empty();
    }

  

 分析其源码可以看到,如果bean上有注解@NacosRefresh,则会自动刷新。

在实际使用时,发现bean上的注解是@Configuration则不会自动刷新,而使用@Component则可以做到自动刷新。

这就和@Component与@Configuration的区别有关了,@Component注解的bean是原生bean,@Configuration是被cglib动态增加的bean。

 

另一种解决办法:

1
2
3
4
5
6
7
8
9
10
11
将配置映射到实体对象,上面添加@RefreshScope 可以实现动态刷新
 
@value注入的配置文件无法刷新。
 
@RefreshScope
@ConfigurationProperties(prefix = "user")
@Component
@DaTa
public class User {
    private String name;
}

  在含有@Value属性的类上加注解@RefreshScope 把配置信息写在nacos配置中心就好啦,之后改变值就会自动刷新,不需要重启项目

个人经验,也试过了,可以自动刷新,希望对你有所帮助!

posted @   张亮java  阅读(6622)  评论(1编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示