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) {

Reply via email to