zoukankan      html  css  js  c++  java
  • 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配置中心就好啦,之后改变值就会自动刷新,不需要重启项目

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

    每天学习一点点,你就进步一点点。
  • 相关阅读:
    InnoDB和MyISAM区别总结
    jquery判断checkbox是否被选中
    手机网站重构经验分享(S60V3篇)
    域名A记录、MX记录、CNAME、TTL
    ubuntu apache2配置详解(含虚拟主机配置方法)
    IP分片攻击
    Linux+Apache+Mysql+PHP典型配置
    apache配置优化测试
    PHP 正则表达式资料
    人人网UGC技术广播站
  • 原文地址:https://www.cnblogs.com/zhangliang88/p/15540882.html
Copyright © 2011-2022 走看看