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 c1fa18efbbf..c102a5e0c01 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,8 +18,8 @@ import java.util.Map; import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; -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; @@ -29,6 +29,15 @@ * @author Jason Song(song_s@ctrip.com) */ public class BeanRegistrationUtil { + private static final Map BD_MAPPING = new ConcurrentHashMap<>(); + + static { + BD_MAPPING.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); @@ -48,9 +57,9 @@ public static boolean registerBeanDefinitionIfNotExists(BeanDefinitionRegistry r return false; } - if (beanDefinition instanceof AnnotatedBeanDefinition) { - MethodMetadata metadata = ((AnnotatedBeanDefinition) beanDefinition).getFactoryMethodMetadata(); - if (metadata != null && Objects.equals(metadata.getReturnTypeName(), beanClass.getName())) { + if (BD_MAPPING.containsKey(beanClass.getName()) && beanDefinition.getSource() != null && beanDefinition.getSource() instanceof MethodMetadata) { + MethodMetadata metadata = (MethodMetadata) beanDefinition.getSource(); + if (Objects.equals(BD_MAPPING.get(beanClass.getName()), String.format("%s#%s", metadata.getDeclaringClassName(), metadata.getMethodName()))) { return false; } }