This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch 3.0 in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit 68fdea818c28129b30e85332c588035c61e2a92d Author: Gong Dewei <[email protected]> AuthorDate: Thu Mar 18 19:27:51 2021 +0800 Improve reference bean definition and prepare logic, fix injection problems of PropertyPlaceholderConfigurer (#7405) --- .../spring/DubboConfigInitializationPostProcessor.java | 17 ++++++++--------- .../org/apache/dubbo/config/spring/ReferenceBean.java | 4 ++-- .../dubbo/config/spring/ReferenceBeanManager.java | 18 +++++++----------- .../ReferenceAnnotationBeanPostProcessor.java | 4 ++-- .../spring/schema/DubboBeanDefinitionParser.java | 7 +++++++ 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/DubboConfigInitializationPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/DubboConfigInitializationPostProcessor.java index 068d700..c6578d2 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/DubboConfigInitializationPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/DubboConfigInitializationPostProcessor.java @@ -30,7 +30,6 @@ import org.springframework.beans.BeansException; import org.springframework.beans.FatalBeanException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; -import org.springframework.beans.factory.BeanInitializationException; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -76,14 +75,14 @@ public class DubboConfigInitializationPostProcessor implements BeanPostProcessor @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - try { - if (bean instanceof ReferenceBean) { - ReferenceBean referenceBean = (ReferenceBean) bean; - referenceBeanManager.addReference(referenceBean); - } - } catch (Exception e) { - throw new BeanInitializationException("Initialization reference bean failed", e); - } +// try { +// if (bean instanceof ReferenceBean) { +// ReferenceBean referenceBean = (ReferenceBean) bean; +// referenceBeanManager.addReference(referenceBean); +// } +// } catch (Exception e) { +// throw new BeanInitializationException("Initialization reference bean failed", e); +// } return bean; } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java index f8f834b..67a38e5 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java @@ -107,7 +107,7 @@ public class ReferenceBean<T> implements FactoryBean, if (referenceProps == null) { Assert.notEmptyString(getId(), "The id of ReferenceBean cannot be empty"); ConfigurableListableBeanFactory beanFactory = getBeanFactory(); - BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition(getId()); + BeanDefinition beanDefinition = beanFactory.getBeanDefinition(getId()); propertyValues = beanDefinition.getPropertyValues(); } } @@ -187,7 +187,7 @@ public class ReferenceBean<T> implements FactoryBean, String consumer = (String) referenceProps.get("consumer"); if (StringUtils.isBlank(generic) && consumer != null) { // get generic from consumerConfig - BeanDefinition consumerBeanDefinition = getBeanFactory().getMergedBeanDefinition(consumer); + BeanDefinition consumerBeanDefinition = getBeanFactory().getBeanDefinition(consumer); if (consumerBeanDefinition != null) { generic = (String) consumerBeanDefinition.getPropertyValues().get("generic"); } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBeanManager.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBeanManager.java index 83765f4..81afe4d 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBeanManager.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBeanManager.java @@ -80,16 +80,6 @@ public class ReferenceBeanManager implements ApplicationContextAware { return configMap.get(id); } -// public ReferenceBean getOrCreateReference(Map<String, String> referenceProps) { -// Integer key = referenceProps.hashCode(); -// return configMap.computeIfAbsent(key, k -> { -// ReferenceBean referenceBean = new ReferenceBean(); -// referenceBean.setReferenceProps(referenceProps); -// //referenceBean.setId(); -// return referenceBean; -// }); -// } - public Collection<ReferenceBean> getReferences() { return configMap.values(); } @@ -104,10 +94,16 @@ public class ReferenceBeanManager implements ApplicationContextAware { * @throws Exception */ public void prepareReferenceBeans() throws Exception { - initialized = true; for (ReferenceBean referenceBean : getReferences()) { initReferenceBean(referenceBean); } + + // prepare all reference beans + Map<String, ReferenceBean> referenceBeanMap = applicationContext.getBeansOfType(ReferenceBean.class, true, false); + for (ReferenceBean referenceBean : referenceBeanMap.values()) { + initReferenceBean(referenceBean); + } + initialized = true; } /** diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java index 7255264..2379f54 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java @@ -114,7 +114,7 @@ public class ReferenceAnnotationBeanPostProcessor extends AbstractAnnotationBean for (String beanName : beanNames) { Class<?> beanType; if (beanFactory.isFactoryBean(beanName)){ - BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition(beanName); + BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); if (isReferenceBean(beanDefinition)) { continue; } @@ -253,7 +253,7 @@ public class ReferenceAnnotationBeanPostProcessor extends AbstractAnnotationBean beanDefinitionRegistry.registerBeanDefinition(referenceBeanName, beanDefinition); getBeanFactory().registerSingleton(referenceBeanName, referenceBean); - referenceBeanManager.addReference(referenceBean); + //referenceBeanManager.addReference(referenceBean); } catch (Exception e) { throw new Exception("Create dubbo reference bean failed", e); } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java index 70f4dfe..417d28b 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java @@ -53,6 +53,7 @@ import java.lang.reflect.Modifier; import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; @@ -258,6 +259,12 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { targetDefinition.setBeanClass(interfaceClass); String id = (String) beanDefinition.getPropertyValues().get("id"); beanDefinition.setDecoratedDefinition(new BeanDefinitionHolder(targetDefinition, id+"_decorated")); + + //mark property value as optional + List<PropertyValue> propertyValues = beanDefinition.getPropertyValues().getPropertyValueList(); + for (PropertyValue propertyValue : propertyValues) { + propertyValue.setOptional(true); + } } private static void getPropertyMap(Class<?> beanClass, Map<String, Class> beanPropsMap) {
