1. 程式人生 > 其它 >Nacos修改配置,資料不重新整理問題

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配置中心就好啦,之後改變值就會自動重新整理,不需要重啟專案

個人經驗,也試過了,可以自動重新整理,希望對你有所幫助!

每天學習一點點,你就進步一點點。