问题描述:
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配置中心就好啦,之后改变值就会自动刷新,不需要重启项目
个人经验,也试过了,可以自动刷新,希望对你有所帮助!