diff --git a/CHANGES.md b/CHANGES.md index 8a188cbe28f..60bbe031bb9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -27,6 +27,7 @@ Apollo 2.0.0 * [Split helm chart into another repo](https://github.com/apolloconfig/apollo/pull/4125) * [fix gray publish refresh item status](https://github.com/apolloconfig/apollo/pull/4128) * [Support only show difference keys when compare namespace](https://github.com/apolloconfig/apollo/pull/4165) +* [Fix the issue that property placeholder doesn't work for dubbo reference beans](https://github.com/apolloconfig/apollo/pull/4175) ------------------ All issues and pull requests are [here](https://github.com/ctripcorp/apollo/milestone/8?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..cfaf14f6a11 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 @@ -18,16 +18,27 @@ import java.util.Map; import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; -import org.springframework.beans.factory.BeanFactory; 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) */ public class BeanRegistrationUtil { + // reserved bean definitions, we should consider drop this if we will upgrade Spring version + private static final Map RESERVED_BEAN_DEFINITIONS = new ConcurrentHashMap<>(); + + static { + RESERVED_BEAN_DEFINITIONS.put( + "org.springframework.context.support.PropertySourcesPlaceholderConfigurer", + "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration#propertySourcesPlaceholderConfigurer" + ); + } + public static boolean registerBeanDefinitionIfNotExists(BeanDefinitionRegistry registry, String beanName, Class beanClass) { return registerBeanDefinitionIfNotExists(registry, beanName, beanClass, null); @@ -41,17 +52,16 @@ 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; - } + String reservedBeanDefinition = RESERVED_BEAN_DEFINITIONS.get(beanClass.getName()); + 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 (reservedBeanDefinition != null && beanDefinition.getSource() != null && beanDefinition.getSource() instanceof MethodMetadata) { + MethodMetadata metadata = (MethodMetadata) beanDefinition.getSource(); + if (Objects.equals(reservedBeanDefinition, String.format("%s#%s", metadata.getDeclaringClassName(), metadata.getMethodName()))) { return false; } }