private void handleMethodNacosConfigListener()

in spring-cloud-alibaba-starters/spring-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/annotation/NacosAnnotationProcessor.java [301:405]


	private void handleMethodNacosConfigListener(NacosConfigListener annotation, String beanName, Object bean, Method method) {
		String dataId = annotation.dataId();
		String group = annotation.group();
		String key = annotation.key();
		try {
			Type[] parameterTypes = method.getGenericParameterTypes();
			if (parameterTypes.length != 1) {
				throw new RuntimeException(
						"@NacosConfigListener  must be over a method with  a single parameter");
			}

			String configInfo = getGroupKeyContent(dataId, group);
			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);

			TargetRefreshable listener = null;
			if (org.springframework.util.StringUtils.hasText(key)) {
				listener = new NacosPropertiesKeyListener(bean, wrapArrayToSet(key)) {

					@Override
					public void configChanged(ConfigChangeEvent event) {
						try {
							ConfigChangeItem changeItem = event.getChangeItem(key);
							String newConfig = changeItem == null ? null : changeItem.getNewValue();

							if (org.springframework.util.StringUtils.hasText(newConfig)) {
								if (invokePrimitiveMethod(method, getTarget(), newConfig)) {
									return;
								}

								Object targetObject = convertContentToTargetType(newConfig, parameterTypes[0]);
								ReflectionUtils.invokeMethod(method, getTarget(), targetObject);
							}
						}
						catch (Exception e) {
							throw new RuntimeException(e);
						}
					}

					@Override
					public String toString() {
						return String.format("[spring cloud alibaba nacos config key listener , key %s , target %s ] ", key, bean + "#" + methodSignature(method));
					}
				};
				((AbstractConfigChangeListener) listener).fillContext(dataId, group);
				if (!annotation.initNotify()) {
					((AbstractConfigChangeListener) listener).setLastContent(configInfo);
				}
			}
			else {
				listener = new NacosConfigRefreshableListener(bean) {

					@Override
					public void receiveConfigInfo(String configInfo) {
						if (org.springframework.util.StringUtils.hasText(configInfo)) {
							try {
								if (invokePrimitiveMethod(method, getTarget(), configInfo)) {
									return;
								}
								Object targetObject = convertContentToTargetType(configInfo, parameterTypes[0]);
								ReflectionUtils.invokeMethod(method, getTarget(), targetObject);
							}
							catch (Exception e) {
								throw new RuntimeException(e);
							}

						}
					}

					@Override
					public String toString() {
						return String.format("[spring cloud alibaba nacos config  listener ,  target %s ] ", bean + "#" + methodSignature(method));
					}
				};
			}

			getNacosConfigManager().getConfigService().addListener(dataId, group, listener);
			targetListenerMap.put(refreshTargetKey, listener);
			if (annotation.initNotify() && org.springframework.util.StringUtils.hasText(configInfo)) {
				try {
					log.info("[Nacos Config] init notify listener of {}  on {} start...", refreshTargetKey,
							bean);
					listener.receiveConfigInfo(configInfo);
					log.info("[Nacos Config] init notify listener of {}  on {} finished ", refreshTargetKey,
							bean);
				}
				catch (Throwable throwable) {
					log.warn("[Nacos Config] init notify listener error", throwable);
					throw throwable;
				}
			}
		}
		catch (Throwable e) {
			throw new RuntimeException(e);
		}
	}