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