You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2021/11/25 06:20:15 UTC

[dubbo] 29/45: fix ConcurrentModificationException of beanDefinitionNames, change bean definition abstractFlag to disable/enable it

This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch release/3.0.14-rpccontext-bugfix
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit 587cb16c41fed692233174d7bd364a443579201e
Author: 赫炎 <de...@alibaba-inc.com>
AuthorDate: Wed Dec 9 12:20:39 2020 +0800

    fix ConcurrentModificationException of beanDefinitionNames, change bean definition  abstractFlag to disable/enable it
---
 .../config/DubboConfigBeanPostProcessor.java       | 43 +++++++++++++++-------
 1 file changed, 29 insertions(+), 14 deletions(-)

diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/config/DubboConfigBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/config/DubboConfigBeanPostProcessor.java
index 9b4cd15..acafa2a 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/config/DubboConfigBeanPostProcessor.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/config/DubboConfigBeanPostProcessor.java
@@ -35,6 +35,8 @@ import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.AbstractBeanFactory;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
 import org.springframework.context.ApplicationContext;
@@ -64,9 +66,9 @@ public class DubboConfigBeanPostProcessor implements BeanDefinitionRegistryPostP
 
     private BeanDefinitionRegistry registry;
     private ApplicationContext applicationContext;
-    private Map<String, BeanDefinition> stashBeanDefinitions = new HashMap<>();
     private static AtomicBoolean configBeansLoading = new AtomicBoolean();
     private static volatile boolean configBeansLoaded;
+    private AbstractBeanFactory beanFactory;
 
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
@@ -76,10 +78,13 @@ public class DubboConfigBeanPostProcessor implements BeanDefinitionRegistryPostP
     @Override
     public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
         this.registry = registry;
+        if (registry instanceof AbstractBeanFactory) {
+            beanFactory = (AbstractBeanFactory) registry;
+        }
 
-        // remove dubbo reference beans from registry, avoiding useless early initialization.
-        // dubbo reference beans will be insert to registry again after dubbo core framework is initialized
-        saveReferenceBeans(registry);
+        // disable dubbo reference beans from registry, avoiding useless early initialization.
+        // dubbo reference beans will be enable again after dubbo core framework is initialized
+        disableReferenceBeans(registry);
     }
 
     @Override
@@ -92,8 +97,8 @@ public class DubboConfigBeanPostProcessor implements BeanDefinitionRegistryPostP
         if (configBeansLoading.compareAndSet(false, true)) {
             // Initializes Dubbo's Config Beans before @Reference bean autowiring
             prepareDubboConfigBeans();
-            // insert dubbo reference beans to registry
-            applyReferenceBeans(registry);
+            // enable dubbo reference beans
+            enableReferenceBeans(registry);
             configBeansLoaded = true;
         }
 
@@ -101,22 +106,32 @@ public class DubboConfigBeanPostProcessor implements BeanDefinitionRegistryPostP
         return bean;
     }
 
-    private void saveReferenceBeans(BeanDefinitionRegistry registry) {
+    private void disableReferenceBeans(BeanDefinitionRegistry registry) {
+        String className = ReferenceBean.class.getName();
         String[] beanDefinitionNames = registry.getBeanDefinitionNames();
         for (String beanName : beanDefinitionNames) {
             BeanDefinition beanDefinition = registry.getBeanDefinition(beanName);
-            if (ReferenceBean.class.getName().equals(beanDefinition.getBeanClassName())) {
-                stashBeanDefinitions.put(beanName, beanDefinition);
-                registry.removeBeanDefinition(beanName);
+            if (className.equals(beanDefinition.getBeanClassName())) {
+                ((AbstractBeanDefinition)beanDefinition).setAbstract(true);
             }
         }
     }
 
-    private void applyReferenceBeans(BeanDefinitionRegistry registry) {
-        for (Map.Entry<String, BeanDefinition> entry : stashBeanDefinitions.entrySet()) {
-            registry.registerBeanDefinition(entry.getKey(), entry.getValue());
+    private void enableReferenceBeans(BeanDefinitionRegistry registry) {
+        String className = ReferenceBean.class.getName();
+        String[] beanDefinitionNames = registry.getBeanDefinitionNames();
+        for (String beanName : beanDefinitionNames) {
+            BeanDefinition beanDefinition = registry.getBeanDefinition(beanName);
+            if (className.equals(beanDefinition.getBeanClassName())) {
+                ((AbstractBeanDefinition)beanDefinition).setAbstract(false);
+                if (this.beanFactory != null) {
+                    BeanDefinition mergedBeanDefinition = this.beanFactory.getMergedBeanDefinition(beanName);
+                    if (mergedBeanDefinition != null) {
+                        ((AbstractBeanDefinition)mergedBeanDefinition).setAbstract(false);
+                    }
+                }
+            }
         }
-        stashBeanDefinitions.clear();
     }
 
     private void prepareDubboConfigBeans() {