记录一下,这里其实很类似nacos的@Value,注解,可以结合去理解。
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
Class<?> beanClass = bean.getClass();
Field[] fields = beanClass.getDeclaredFields();
for (Field field : fields) {
if (!field.isAnnotationPresent(DCCValue.class)) {
continue;
}
DCCValue dccValue = field.getAnnotation(DCCValue.class);
String value = dccValue.value();
if (StringUtils.isBlank(value)) {
throw new RuntimeException(field.getName() + " @DCCValue is not config value config case 「isSwitch/isSwitch:1」");
}
String[] splits = value.split(":");
String key = splits[0];
String defaultValue = splits.length == 2 ? splits[1] : null;
try {
// 判断当前节点是否存在,不存在则创建出 Zookeeper 节点
String keyPath = BASE_CONFIG_PATH_CONFIG.concat("/").concat(key);
if (null == client.checkExists().forPath(keyPath)) {
client.create().creatingParentsIfNeeded().forPath(keyPath);
if (StringUtils.isNotBlank(defaultValue)) {
field.setAccessible(true);
field.set(bean, defaultValue);
field.setAccessible(false);
}
log.info("DCC 节点监听 创建节点 {}", keyPath);
} else {
String configValue = new String(client.getData().forPath(keyPath));
if (StringUtils.isNotBlank(configValue)) {
field.setAccessible(true);
field.set(bean, configValue);
field.setAccessible(false);
log.info("DCC 节点监听 设置配置 {} {} {}", keyPath, field.getName(), configValue);
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
dccObjGroup.put(BASE_CONFIG_PATH_CONFIG.concat("/").concat(key), bean);
}
return bean;
}
解答疑惑:
1. 平时使用配置中心时,注解标记后能读取到配置的原因
2. 注解中设置了默认值,当读取配置中心为空时,使用该默认值的原因