From 83e87ba73f7ee108e1da67bf49bdb6212d8a1836 Mon Sep 17 00:00:00 2001 From: Lonre Wang Date: Sun, 19 Dec 2021 13:13:14 +0800 Subject: [PATCH] Fix #4152 (#4161) * Fix #4152 `beanFactory.isTypeMatch` may lead to the initialization of FactoryBean, dubbo consumer is a ReferenceBean which implements FactoryBean. related to #2328 #3865 * Update CHANGES.md Co-authored-by: Jason Song --- CHANGES.md | 1 + .../spring/util/BeanRegistrationUtil.java | 21 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f4880aff50d..f6db913d6ce 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ Release Notes. Apollo 1.9.2 ------------------ +* [Fix the issue that property placeholder doesn't work for dubbo reference beans](https://github.com/apolloconfig/apollo/pull/4161) ------------------ All issues and pull requests are [here](https://github.com/apolloconfig/apollo/milestone/10?closed=1) diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/util/BeanRegistrationUtil.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/util/BeanRegistrationUtil.java index 27b0cf5976d..c1fa18efbbf 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/util/BeanRegistrationUtil.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/util/BeanRegistrationUtil.java @@ -19,10 +19,11 @@ import java.util.Map; import java.util.Objects; -import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.core.type.MethodMetadata; /** * @author Jason Song(song_s@ctrip.com) @@ -41,17 +42,15 @@ public static boolean registerBeanDefinitionIfNotExists(BeanDefinitionRegistry r String[] candidates = registry.getBeanDefinitionNames(); - if (registry instanceof BeanFactory) { - final BeanFactory beanFactory = (BeanFactory) registry; - for (String candidate : candidates) { - if (beanFactory.isTypeMatch(candidate, beanClass)) { - return false; - } + for (String candidate : candidates) { + BeanDefinition beanDefinition = registry.getBeanDefinition(candidate); + if (Objects.equals(beanDefinition.getBeanClassName(), beanClass.getName())) { + return false; } - } else { - for (String candidate : candidates) { - BeanDefinition beanDefinition = registry.getBeanDefinition(candidate); - if (Objects.equals(beanDefinition.getBeanClassName(), beanClass.getName())) { + + if (beanDefinition instanceof AnnotatedBeanDefinition) { + MethodMetadata metadata = ((AnnotatedBeanDefinition) beanDefinition).getFactoryMethodMetadata(); + if (metadata != null && Objects.equals(metadata.getReturnTypeName(), beanClass.getName())) { return false; } }