From 92bc1ac511f052eff41e18d83df67b80bebe8089 Mon Sep 17 00:00:00 2001 From: Lonre Wang Date: Tue, 21 Dec 2021 19:54:36 +0800 Subject: [PATCH] Fix #4152 `beanFactory.isTypeMatch` may lead to the initialization of FactoryBean, dubbo consumer is a ReferenceBean which implements FactoryBean. support spring 3 related to #2328 #3865 #4161 #4164 --- .../spring/util/BeanRegistrationUtil.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) 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..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,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,16 @@ * @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); @@ -42,15 +52,16 @@ public static boolean registerBeanDefinitionIfNotExists(BeanDefinitionRegistry r String[] candidates = registry.getBeanDefinitionNames(); + 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; } - if (beanDefinition instanceof AnnotatedBeanDefinition) { - MethodMetadata metadata = ((AnnotatedBeanDefinition) beanDefinition).getFactoryMethodMetadata(); - if (metadata != null && Objects.equals(metadata.getReturnTypeName(), 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; } }