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


    问题描述:

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

    解决办法:

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

    @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。

    另一种解决办法:

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

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

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

    每天学习一点点,你就进步一点点。
  • 相关阅读:
    闭包总结
    执行上下文总结
    下拉列表
    练习 九九乘法表
    JavaScript中break和continue的区别
    JaveScript遍历数组的方法
    将一个块级元素水平和垂直居中的方法
    ECMAScript 中最常见的一个问题是字符串连接的性能
    JS 一些题目 难点
    JS闭包
  • 原文地址:https://www.cnblogs.com/zhangliang88/p/15540882.html
Copyright © 2020-2023  润新知