in spring-cloud-alibaba-starters/spring-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/annotation/NacosAnnotationProcessor.java [237:281]
private void handleMethodNacosConfigKeysChangeListener(NacosConfigKeysListener annotation, String beanName, Object bean,
Method method) {
String dataId = annotation.dataId();
String group = annotation.group();
try {
Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length != 1 || !ConfigChangeEvent.class.isAssignableFrom(parameterTypes[0])) {
throw new RuntimeException(
"NacosConfigKeysChangeListener must be marked as a single parameter with ConfigChangeEvent");
}
String refreshTargetKey = beanName + "#method#" + methodSignature(method);
TargetRefreshable currentTarget = targetListenerMap.get(refreshTargetKey);
if (currentTarget != null) {
log.info("[Nacos Config] reset {} listener from {} to {} ", refreshTargetKey,
currentTarget.getTarget(), bean);
targetListenerMap.get(refreshTargetKey).setTarget(bean);
return;
}
log.info("[Nacos Config] register {} listener on {} ", refreshTargetKey,
bean);
// annotation on string.
NacosPropertiesKeyListener nacosPropertiesKeyListener = new NacosPropertiesKeyListener(bean, wrapArrayToSet(annotation.interestedKeys()),
wrapArrayToSet(annotation.interestedKeyPrefixes())) {
@Override
public void configChanged(ConfigChangeEvent event) {
ReflectionUtils.invokeMethod(method, this.getTarget(), event);
}
@Override
public String toString() {
return String.format("sca nacos config listener on bean method %s", bean + "#" + methodSignature(method));
}
};
nacosPropertiesKeyListener.setLastContent(getGroupKeyContent(dataId, group));
getNacosConfigManager().getConfigService().addListener(dataId, group,
nacosPropertiesKeyListener);
targetListenerMap.put(refreshTargetKey, nacosPropertiesKeyListener);
}
catch (Throwable e) {
throw new RuntimeException(e);
}
}