Nacos修改配置,資料不重新整理問題
阿新 • • 發佈:2021-11-11
問題描述:
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配置中心就好啦,之後改變值就會自動重新整理,不需要重啟專案
個人經驗,也試過了,可以自動重新整理,希望對你有所幫助!
每天學習一點點,你就進步一點點。