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

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

posted @ 2021-11-11 17:31  张亮java  阅读(6006)  评论(1编辑  收藏  举报