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

[dubbo] branch 3.0 updated: [3.0] Fix @DubboReference.consumer() lookup error (#9175)

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

albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 8273598  [3.0] Fix @DubboReference.consumer() lookup error (#9175)
8273598 is described below

commit 82735984389f4c8840db52a9f535bb683c87608f
Author: Gong Dewei <ky...@qq.com>
AuthorDate: Thu Nov 4 17:01:05 2021 +0800

    [3.0] Fix @DubboReference.consumer() lookup error (#9175)
    
    * Delegate application ConfigManager
    
    * Fix #9172, get consumer from config manager
    
    * Fix ReferenceCreatorTest
---
 .../dubbo/config/annotation/DubboReference.java    |   4 +-
 .../dubbo/config/annotation/DubboService.java      |   2 +-
 .../dubbo/config/context/ModuleConfigManager.java  | 115 +++++++++++++++++
 .../dubbo/config/context/ConfigManagerTest.java    |   8 +-
 .../annotation/ServiceAnnotationPostProcessor.java |  10 +-
 .../config/spring/reference/ReferenceCreator.java  | 139 ++++++---------------
 .../factory/annotation/ReferenceCreatorTest.java   |  40 +++++-
 .../issue9172/MultipleConsumerAndProviderTest.java | 123 ++++++++++++++++++
 .../META-INF/issues/issue9172/consumer.properties  |  30 +++++
 .../META-INF/issues/issue9172/provider.properties  |  24 ++++
 10 files changed, 383 insertions(+), 112 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/annotation/DubboReference.java b/dubbo-common/src/main/java/org/apache/dubbo/config/annotation/DubboReference.java
index cc74ae2..6b5c215 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/annotation/DubboReference.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/annotation/DubboReference.java
@@ -269,8 +269,8 @@ public @interface DubboReference {
     String[] parameters() default {};
 
     /**
-     * Application associated name
-     * @deprecated Do not set it and use the global Application Config
+     * Application name
+     * @deprecated This attribute was deprecated, use bind application/module of spring ApplicationContext
      */
     @Deprecated
     String application() default "";
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/annotation/DubboService.java b/dubbo-common/src/main/java/org/apache/dubbo/config/annotation/DubboService.java
index be665e4..74f5f56 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/annotation/DubboService.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/annotation/DubboService.java
@@ -263,7 +263,7 @@ public @interface DubboService {
 
     /**
      * Application spring bean name
-     * @deprecated Do not set it and use the global Application Config
+     * @deprecated This attribute was deprecated, use bind application/module of spring ApplicationContext
      */
     @Deprecated
     String application() default "";
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java
index 90cadc9..c8c802a 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java
@@ -22,11 +22,19 @@ import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.config.AbstractConfig;
 import org.apache.dubbo.config.AbstractInterfaceConfig;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ConfigCenterConfig;
 import org.apache.dubbo.config.ConsumerConfig;
+import org.apache.dubbo.config.MetadataReportConfig;
+import org.apache.dubbo.config.MetricsConfig;
 import org.apache.dubbo.config.ModuleConfig;
+import org.apache.dubbo.config.MonitorConfig;
+import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.ProviderConfig;
 import org.apache.dubbo.config.ReferenceConfigBase;
+import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.ServiceConfigBase;
+import org.apache.dubbo.config.SslConfig;
 import org.apache.dubbo.rpc.model.ModuleModel;
 
 import java.util.Arrays;
@@ -47,10 +55,12 @@ public class ModuleConfigManager extends AbstractConfigManager {
     private static final Logger logger = LoggerFactory.getLogger(ModuleConfigManager.class);
 
     private Map<String, AbstractInterfaceConfig> serviceConfigCache = new ConcurrentHashMap<>();
+    private final ConfigManager applicationConfigManager;
 
 
     public ModuleConfigManager(ModuleModel moduleModel) {
         super(moduleModel, Arrays.asList(ModuleConfig.class, ServiceConfigBase.class, ReferenceConfigBase.class, ProviderConfig.class, ConsumerConfig.class));
+        applicationConfigManager = moduleModel.getApplicationModel().getApplicationConfigManager();
     }
 
     // ModuleConfig correlative methods
@@ -259,4 +269,109 @@ public class ModuleConfigManager extends AbstractConfigManager {
         checkDefaultAndValidateConfigs(ModuleConfig.class);
     }
 
+
+    //
+    // Delegate read application configs
+    //
+
+    public ConfigManager getApplicationConfigManager() {
+        return applicationConfigManager;
+    }
+
+    @Override
+    public <C extends AbstractConfig> Map<String, C> getConfigsMap(Class<C> cls) {
+        if (isSupportConfigType(cls)) {
+            return super.getConfigsMap(cls);
+        } else {
+            // redirect to application ConfigManager
+            return applicationConfigManager.getConfigsMap(cls);
+        }
+    }
+
+    @Override
+    public <C extends AbstractConfig> Collection<C> getConfigs(Class<C> configType) {
+        if (isSupportConfigType(configType)) {
+            return super.getConfigs(configType);
+        } else {
+            return applicationConfigManager.getConfigs(configType);
+        }
+    }
+
+    @Override
+    public <T extends AbstractConfig> Optional<T> getConfig(Class<T> cls, String idOrName) {
+        if (isSupportConfigType(cls)) {
+            return super.getConfig(cls, idOrName);
+        } else {
+            return applicationConfigManager.getConfig(cls, idOrName);
+        }
+    }
+
+    @Override
+    public <C extends AbstractConfig> List<C> getDefaultConfigs(Class<C> cls) {
+        if (isSupportConfigType(cls)) {
+            return super.getDefaultConfigs(cls);
+        } else {
+            return applicationConfigManager.getDefaultConfigs(cls);
+        }
+    }
+
+    public Optional<ApplicationConfig> getApplication() {
+        return applicationConfigManager.getApplication();
+    }
+
+    public Optional<MonitorConfig> getMonitor() {
+        return applicationConfigManager.getMonitor();
+    }
+
+    public Optional<MetricsConfig> getMetrics() {
+        return applicationConfigManager.getMetrics();
+    }
+
+    public Optional<SslConfig> getSsl() {
+        return applicationConfigManager.getSsl();
+    }
+
+    public Optional<Collection<ConfigCenterConfig>> getDefaultConfigCenter() {
+        return applicationConfigManager.getDefaultConfigCenter();
+    }
+
+    public Optional<ConfigCenterConfig> getConfigCenter(String id) {
+        return applicationConfigManager.getConfigCenter(id);
+    }
+
+    public Collection<ConfigCenterConfig> getConfigCenters() {
+        return applicationConfigManager.getConfigCenters();
+    }
+
+    public Collection<MetadataReportConfig> getMetadataConfigs() {
+        return applicationConfigManager.getMetadataConfigs();
+    }
+
+    public Collection<MetadataReportConfig> getDefaultMetadataConfigs() {
+        return applicationConfigManager.getDefaultMetadataConfigs();
+    }
+
+    public Optional<ProtocolConfig> getProtocol(String idOrName) {
+        return applicationConfigManager.getProtocol(idOrName);
+    }
+
+    public List<ProtocolConfig> getDefaultProtocols() {
+        return applicationConfigManager.getDefaultProtocols();
+    }
+
+    public Collection<ProtocolConfig> getProtocols() {
+        return applicationConfigManager.getProtocols();
+    }
+
+    public Optional<RegistryConfig> getRegistry(String id) {
+        return applicationConfigManager.getRegistry(id);
+    }
+
+    public List<RegistryConfig> getDefaultRegistries() {
+        return applicationConfigManager.getDefaultRegistries();
+    }
+
+    public Collection<RegistryConfig> getRegistries() {
+        return applicationConfigManager.getRegistries();
+    }
 }
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
index 2a43e46..8e50939 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
@@ -105,6 +105,7 @@ public class ConfigManagerTest {
         configManager.setApplication(config);
         assertTrue(configManager.getApplication().isPresent());
         assertEquals(config, configManager.getApplication().get());
+        assertEquals(config, moduleConfigManager.getApplication().get());
     }
 
     // Test MonitorConfig correlative methods
@@ -115,6 +116,7 @@ public class ConfigManagerTest {
         configManager.setMonitor(monitorConfig);
         assertTrue(configManager.getMonitor().isPresent());
         assertEquals(monitorConfig, configManager.getMonitor().get());
+        assertEquals(monitorConfig, moduleConfigManager.getMonitor().get());
     }
 
     // Test MonitorConfig correlative methods
@@ -134,6 +136,7 @@ public class ConfigManagerTest {
         configManager.setMetrics(config);
         assertTrue(configManager.getMetrics().isPresent());
         assertEquals(config, configManager.getMetrics().get());
+        assertEquals(config, moduleConfigManager.getMetrics().get());
     }
 
     // Test ProviderConfig correlative methods
@@ -183,6 +186,7 @@ public class ConfigManagerTest {
         assertEquals(1, configs.size());
         assertEquals(config, configs.iterator().next());
         assertFalse(configManager.getDefaultProtocols().isEmpty());
+        assertEquals(configs, moduleConfigManager.getProtocols());
     }
 
     // Test RegistryConfig correlative methods
@@ -194,6 +198,7 @@ public class ConfigManagerTest {
         assertEquals(1, configs.size());
         assertEquals(config, configs.iterator().next());
         assertFalse(configManager.getDefaultRegistries().isEmpty());
+        assertEquals(configs, moduleConfigManager.getRegistries());
     }
 
     // Test ConfigCenterConfig correlative methods
@@ -215,7 +220,7 @@ public class ConfigManagerTest {
         configs = configManager.getConfigCenters();
         assertEquals(1, configs.size());
         assertEquals(config, configs.iterator().next());
-
+        assertEquals(configs, moduleConfigManager.getConfigCenters());
     }
 
     @Test
@@ -232,6 +237,7 @@ public class ConfigManagerTest {
     @Test
     public void testRefreshAll() {
         configManager.refreshAll();
+        moduleConfigManager.refreshAll();
     }
 
     @Test
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
index 9313315..08814b1 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
@@ -470,11 +470,11 @@ public class ServiceAnnotationPostProcessor implements BeanDefinitionRegistryPos
             addPropertyReference(builder, "monitor", monitorConfigId);
         }
 
-        // application reference
-        String applicationConfigId = (String) serviceAnnotationAttributes.get("application");
-        if (StringUtils.hasText(applicationConfigId)) {
-            addPropertyReference(builder, "application", applicationConfigId);
-        }
+        // deprecate application reference
+//        String applicationConfigId = (String) serviceAnnotationAttributes.get("application");
+//        if (StringUtils.hasText(applicationConfigId)) {
+//            addPropertyReference(builder, "application", applicationConfigId);
+//        }
 
         // module reference
         String moduleConfigId = (String) serviceAnnotationAttributes.get("module");
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceCreator.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceCreator.java
index 8c2fc46..9dc3095 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceCreator.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceCreator.java
@@ -19,19 +19,20 @@ package org.apache.dubbo.config.spring.reference;
 import com.alibaba.spring.util.AnnotationUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.AbstractConfig;
 import org.apache.dubbo.config.ArgumentConfig;
 import org.apache.dubbo.config.ConsumerConfig;
 import org.apache.dubbo.config.MethodConfig;
 import org.apache.dubbo.config.ModuleConfig;
 import org.apache.dubbo.config.MonitorConfig;
 import org.apache.dubbo.config.ReferenceConfig;
-import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.annotation.Argument;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.Method;
 import org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationPropertyValuesAdapter;
 import org.apache.dubbo.config.spring.util.DubboAnnotationUtils;
+import org.apache.dubbo.config.spring.util.DubboBeanUtils;
+import org.apache.dubbo.rpc.model.ModuleModel;
 import org.springframework.beans.propertyeditors.StringTrimmerEditor;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.convert.support.DefaultConversionService;
@@ -39,13 +40,9 @@ import org.springframework.util.Assert;
 import org.springframework.util.StringUtils;
 import org.springframework.validation.DataBinder;
 
-import java.util.Arrays;
-import java.util.List;
 import java.util.Map;
 
 import static com.alibaba.spring.util.AnnotationUtils.getAttribute;
-import static com.alibaba.spring.util.BeanFactoryUtils.getBeans;
-import static com.alibaba.spring.util.BeanFactoryUtils.getOptionalBean;
 import static com.alibaba.spring.util.ObjectUtils.of;
 
 /**
@@ -72,6 +69,7 @@ public class ReferenceCreator {
     protected final ClassLoader classLoader;
 
     protected Class<?> defaultInterfaceClass;
+    private final ModuleModel moduleModel;
 
     private ReferenceCreator(Map<String, Object> attributes, ApplicationContext applicationContext) {
         Assert.notNull(attributes, "The Annotation attributes must not be null!");
@@ -80,6 +78,8 @@ public class ReferenceCreator {
         this.applicationContext = applicationContext;
         this.classLoader = applicationContext.getClassLoader() != null ?
                 applicationContext.getClassLoader() : Thread.currentThread().getContextClassLoader();
+        moduleModel = DubboBeanUtils.getModuleModel(applicationContext);
+        Assert.notNull(moduleModel, "ModuleModel not found in Spring ApplicationContext");
     }
 
     public final ReferenceConfig build() throws Exception {
@@ -98,108 +98,49 @@ public class ReferenceCreator {
 
     protected void configureBean(ReferenceConfig configBean) throws Exception {
 
-        populateBean(attributes, configBean);
+        populateBean(configBean);
 
-        //configureRegistryConfigs(configBean);
+        // deprecate application reference
+        //configureApplicationConfig(configBean);
 
         configureMonitorConfig(configBean);
 
-        configureApplicationConfig(configBean);
-
         configureModuleConfig(configBean);
 
-        //interfaceClass
-        //configureInterface(attributes, configBean);
-
-        configureConsumerConfig(attributes, configBean);
-
-        //configureMethodConfig(attributes, configBean);
-
-        //bean.setApplicationContext(applicationContext);
-        //bean.afterPropertiesSet();
-
-    }
-
-    private void configureRegistryConfigs(ReferenceConfig configBean) {
-
-        String[] registryConfigBeanIds = getAttribute(attributes, "registry");
-        if (registryConfigBeanIds != null) {
-            List<RegistryConfig> registryConfigs = getBeans(applicationContext, registryConfigBeanIds, RegistryConfig.class);
-            configBean.setRegistries(registryConfigs);
-        }
+        configureConsumerConfig(configBean);
 
     }
 
     private void configureMonitorConfig(ReferenceConfig configBean) {
-
-        String monitorBeanName = getAttribute(attributes, "monitor");
-
-        MonitorConfig monitorConfig = getOptionalBean(applicationContext, monitorBeanName, MonitorConfig.class);
-
-        configBean.setMonitor(monitorConfig);
-
+        String monitorConfigId = getAttribute(attributes, "monitor");
+        if (StringUtils.hasText(monitorConfigId)) {
+            MonitorConfig monitorConfig = getConfig(monitorConfigId, MonitorConfig.class);
+            configBean.setMonitor(monitorConfig);
+        }
     }
 
-    private void configureApplicationConfig(ReferenceConfig configBean) {
-
-        String applicationConfigBeanName = getAttribute(attributes, "application");
-
-        ApplicationConfig applicationConfig =
-                getOptionalBean(applicationContext, applicationConfigBeanName, ApplicationConfig.class);
-
-        configBean.setApplication(applicationConfig);
-
-    }
+//    private void configureApplicationConfig(ReferenceConfig configBean) {
+//        String applicationConfigId = getAttribute(attributes, "application");
+//        if (StringUtils.hasText(applicationConfigId)) {
+//            ApplicationConfig applicationConfig = getConfig(applicationConfigId, ApplicationConfig.class);
+//            configBean.setApplication(applicationConfig);
+//        }
+//    }
 
     private void configureModuleConfig(ReferenceConfig configBean) {
-
-        String moduleConfigBeanName = getAttribute(attributes, "module");
-
-        ModuleConfig moduleConfig =
-                getOptionalBean(applicationContext, moduleConfigBeanName, ModuleConfig.class);
-
-        configBean.setModule(moduleConfig);
-
-    }
-
-    private void configureInterface(Map<String, Object> attributes, ReferenceConfig referenceBean) {
-        if (referenceBean.getInterface() == null) {
-
-            Object genericValue = getAttribute(attributes, "generic");
-            String generic = (genericValue != null) ? genericValue.toString() : null;
-            referenceBean.setGeneric(generic);
-
-            String interfaceClassName = getAttribute(attributes, "interfaceName");
-            if (StringUtils.hasText(interfaceClassName)) {
-                referenceBean.setInterface(interfaceClassName);
-            } else {
-                Class<?> interfaceClass = getAttribute(attributes, "interfaceClass");
-                if (void.class.equals(interfaceClass)) { // default or set void.class for purpose.
-                    interfaceClass = null;
-                }
-                if (interfaceClass != null) {
-                    Assert.isTrue(interfaceClass.isInterface(),
-                            "The interfaceClass of @DubboReference is not an interface: "+interfaceClass.getName());
-                }
-                // Not present 'interfaceClass' attribute, use default injection type of annotated
-                if (interfaceClass == null && defaultInterfaceClass != null) {
-                    interfaceClass = defaultInterfaceClass;
-                    Assert.isTrue(interfaceClass.isInterface(),
-                            "The class of field or method that was annotated @DubboReference is not an interface!");
-                }
-                // Convert to interface class name, InterfaceClass will be determined later
-                referenceBean.setInterface(interfaceClass.getName());
-            }
+        String moduleConfigId = getAttribute(attributes, "module");
+        if (StringUtils.hasText(moduleConfigId)) {
+            ModuleConfig moduleConfig = getConfig(moduleConfigId, ModuleConfig.class);
+            configBean.setModule(moduleConfig);
         }
     }
 
-
-    private void configureConsumerConfig(Map<String, Object> attributes, ReferenceConfig<?> referenceBean) {
+    private void configureConsumerConfig(ReferenceConfig<?> referenceBean) {
         ConsumerConfig consumerConfig = null;
         Object consumer = getAttribute(attributes, "consumer");
         if (consumer != null) {
             if (consumer instanceof String) {
-                consumerConfig = getOptionalBean(applicationContext, (String) consumer, ConsumerConfig.class);
+                consumerConfig = getConfig((String) consumer, ConsumerConfig.class);
             } else if (consumer instanceof ConsumerConfig) {
                 consumerConfig = (ConsumerConfig) consumer;
             } else {
@@ -209,22 +150,24 @@ public class ReferenceCreator {
         }
     }
 
-    void configureMethodConfig(Map<String, Object> attributes, ReferenceConfig<?> referenceBean) {
-        Object value = attributes.get("methods");
-        if (value instanceof Method[]) {
-            Method[] methods = (Method[]) value;
-            List<MethodConfig> methodConfigs = MethodConfig.constructMethodConfig(methods);
-            if (!methodConfigs.isEmpty()) {
-                referenceBean.setMethods(methodConfigs);
+    private <T extends AbstractConfig> T getConfig(String configIdOrName, Class<T> configType) {
+        // 1. find in ModuleConfigManager
+        T config = moduleModel.getConfigManager().getConfig(configType, configIdOrName).orElse(null);
+        if (config == null) {
+            // 2. find in Spring ApplicationContext
+            if (applicationContext.containsBean(configIdOrName)) {
+                config = applicationContext.getBean(configIdOrName, configType);
             }
-        } else if (value instanceof MethodConfig[]) {
-            MethodConfig[] methodConfigs = (MethodConfig[]) value;
-            referenceBean.setMethods(Arrays.asList(methodConfigs));
         }
+        if (config == null) {
+            throw new IllegalArgumentException(configType.getSimpleName() + " not found: " + configIdOrName);
+        }
+        return config;
     }
 
-    protected void populateBean(Map<String, Object> attributes, ReferenceConfig referenceBean) {
+    protected void populateBean(ReferenceConfig referenceBean) {
         Assert.notNull(defaultInterfaceClass, "The default interface class cannot be empty!");
+        // convert attributes, e.g. interface, registry
         ReferenceBeanSupport.convertReferenceProps(attributes, defaultInterfaceClass);
 
         DataBinder dataBinder = new DataBinder(referenceBean);
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceCreatorTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceCreatorTest.java
index e4b5e81..3e27564 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceCreatorTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceCreatorTest.java
@@ -19,7 +19,10 @@ package org.apache.dubbo.config.spring.beans.factory.annotation;
 
 import com.alibaba.spring.util.AnnotationUtils;
 import org.apache.dubbo.config.ArgumentConfig;
+import org.apache.dubbo.config.ConsumerConfig;
 import org.apache.dubbo.config.MethodConfig;
+import org.apache.dubbo.config.ModuleConfig;
+import org.apache.dubbo.config.MonitorConfig;
 import org.apache.dubbo.config.ReferenceConfig;
 import org.apache.dubbo.config.annotation.Argument;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -29,6 +32,8 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.impl.NotifyService;
 import org.apache.dubbo.config.spring.reference.ReferenceCreator;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.ModuleModel;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -65,6 +70,11 @@ import static org.springframework.util.ReflectionUtils.findField;
 @DirtiesContext(classMode = AFTER_EACH_TEST_METHOD)
 public class ReferenceCreatorTest {
 
+    private static final String MODULE_CONFIG_ID = "mymodule";
+    private static final String CONSUMER_CONFIG_ID = "myconsumer";
+    private static final String MONITOR_CONFIG_ID = "mymonitor";
+    private static final String REGISTRY_CONFIG_ID = "myregistry";
+
     @DubboReference(
             //interfaceClass = HelloService.class,
             version = "1.0.0", group = "TEST_GROUP", url = "dubbo://localhost:12345",
@@ -79,7 +89,7 @@ public class ReferenceCreatorTest {
             timeout = 3, cache = "cache", filter = {"echo", "generic", "accesslog"},
             listener = {"deprecated"}, parameters = {"n1=v1  ", "n2 = v2 ", "  n3 =   v3  "},
             application = "application",
-            module = "module", consumer = "consumer", monitor = "monitor", registry = {"myregistry"},
+            module = MODULE_CONFIG_ID, consumer = CONSUMER_CONFIG_ID, monitor = MONITOR_CONFIG_ID, registry = {REGISTRY_CONFIG_ID},
             // @since 2.7.3
             id = "reference",
             // @since 2.7.8
@@ -156,7 +166,7 @@ public class ReferenceCreatorTest {
         Assertions.assertEquals("reference", referenceBean.getId());
         Assertions.assertEquals(ofSet("service1", "service2", "service3"), referenceBean.getSubscribedServices());
         Assertions.assertEquals("service1,service2,service3", referenceBean.getProvidedBy());
-        Assertions.assertEquals("myregistry", referenceBean.getRegistryIds());
+        Assertions.assertEquals(REGISTRY_CONFIG_ID, referenceBean.getRegistryIds());
 
         // parameters
         Map<String, String> parameters = new HashMap<String, String>();
@@ -195,9 +205,9 @@ public class ReferenceCreatorTest {
 
         // Asserts Null fields
         Assertions.assertThrows(IllegalStateException.class, () -> referenceBean.getApplication());
-        Assertions.assertNull(referenceBean.getModule());
-        Assertions.assertNull(referenceBean.getConsumer());
-        Assertions.assertNull(referenceBean.getMonitor());
+        Assertions.assertNotNull(referenceBean.getModule());
+        Assertions.assertNotNull(referenceBean.getConsumer());
+        Assertions.assertNotNull(referenceBean.getMonitor());
     }
 
 
@@ -209,6 +219,26 @@ public class ReferenceCreatorTest {
             return new NotifyService();
         }
 
+        @Bean("org.apache.dubbo.rpc.model.ModuleModel")
+        public ModuleModel moduleModel() {
+            return ApplicationModel.defaultModel().getDefaultModule();
+        }
+
+        @Bean(CONSUMER_CONFIG_ID)
+        public ConsumerConfig consumerConfig() {
+            return new ConsumerConfig();
+        }
+
+        @Bean(MONITOR_CONFIG_ID)
+        public MonitorConfig monitorConfig(){
+            return new MonitorConfig();
+        }
+
+        @Bean(MODULE_CONFIG_ID)
+        public ModuleConfig moduleConfig(){
+            return new ModuleConfig();
+        }
+
     }
 
 }
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9172/MultipleConsumerAndProviderTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9172/MultipleConsumerAndProviderTest.java
new file mode 100644
index 0000000..91b86da
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9172/MultipleConsumerAndProviderTest.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.config.spring.issues.issue9172;
+
+import org.apache.dubbo.config.ReferenceConfigBase;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.apache.dubbo.config.context.ModuleConfigManager;
+import org.apache.dubbo.config.spring.api.DemoService;
+import org.apache.dubbo.config.spring.api.HelloService;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.apache.dubbo.config.spring.impl.DemoServiceImpl;
+import org.apache.dubbo.config.spring.impl.HelloServiceImpl;
+import org.apache.dubbo.config.spring.registrycenter.ZookeeperMultipleRegistryCenter;
+import org.apache.dubbo.config.spring.util.DubboBeanUtils;
+import org.apache.dubbo.rpc.model.ModuleModel;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.PropertySource;
+
+/**
+ * Test for issue 9172
+ */
+public class MultipleConsumerAndProviderTest {
+
+    private static ZookeeperMultipleRegistryCenter registryCenter;
+
+    @BeforeAll
+    public static void setUp() {
+        registryCenter = new ZookeeperMultipleRegistryCenter();
+        registryCenter.startup();
+    }
+
+    @AfterAll
+    public static void tearDown() {
+        if (registryCenter != null) {
+            registryCenter.shutdown();
+        }
+    }
+
+    @Test
+    public void test() {
+
+        AnnotationConfigApplicationContext providerContext = null;
+        AnnotationConfigApplicationContext consumerContext = null;
+
+        try {
+            providerContext = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
+            consumerContext = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
+
+            ModuleModel consumerModuleModel = DubboBeanUtils.getModuleModel(consumerContext);
+            ModuleConfigManager consumerConfigManager = consumerModuleModel.getConfigManager();
+            ReferenceConfigBase helloServiceOneConfig = consumerConfigManager.getReference("helloServiceOne");
+            ReferenceConfigBase demoServiceTwoConfig = consumerConfigManager.getReference("demoServiceTwo");
+            Assertions.assertEquals(consumerConfigManager.getConsumer("consumer-one").get(), helloServiceOneConfig.getConsumer());
+            Assertions.assertEquals(consumerConfigManager.getConsumer("consumer-two").get(), demoServiceTwoConfig.getConsumer());
+            Assertions.assertEquals(consumerConfigManager.getRegistry("registry-one").get(), helloServiceOneConfig.getRegistry());
+            Assertions.assertEquals(consumerConfigManager.getRegistry("registry-two").get(), demoServiceTwoConfig.getRegistry());
+
+            HelloService helloServiceOne = consumerContext.getBean("helloServiceOne", HelloService.class);
+            DemoService demoServiceTwo = consumerContext.getBean("demoServiceTwo", DemoService.class);
+            String sayHello = helloServiceOne.sayHello("dubbo");
+            String sayName = demoServiceTwo.sayName("dubbo");
+            Assertions.assertEquals("Hello, dubbo", sayHello);
+            Assertions.assertEquals("say:dubbo", sayName);
+        } finally {
+            if (providerContext != null) {
+                providerContext.close();
+            }
+            if (consumerContext != null) {
+                consumerContext.close();
+            }
+        }
+    }
+
+
+    @EnableDubbo(scanBasePackages = "")
+    @PropertySource("classpath:/META-INF/issues/issue9172/consumer.properties")
+    static class ConsumerConfiguration {
+
+        @DubboReference(consumer = "consumer-one")
+        private HelloService helloServiceOne;
+
+        @DubboReference(consumer = "consumer-two")
+        private DemoService demoServiceTwo;
+
+    }
+
+    @EnableDubbo(scanBasePackages = "")
+    @PropertySource("classpath:/META-INF/issues/issue9172/provider.properties")
+    static class ProviderConfiguration {
+
+        @Bean
+        @DubboService(provider = "provider-one")
+        public HelloService helloServiceOne() {
+            return new HelloServiceImpl();
+        }
+
+        @Bean
+        @DubboService(provider = "provider-two")
+        public DemoService demoServiceTwo() {
+            return new DemoServiceImpl();
+        }
+    }
+}
diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/issues/issue9172/consumer.properties b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/issues/issue9172/consumer.properties
new file mode 100644
index 0000000..603c145
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/issues/issue9172/consumer.properties
@@ -0,0 +1,30 @@
+dubbo.application.name=consumer-app
+dubbo.application.owner=com.test
+dubbo.application.organization=test
+dubbo.application.logger=slf4j
+dubbo.application.compiler=javassist
+dubbo.application.qosEnable=false
+
+# registry-one
+dubbo.registries.registry-one.id=registry-one
+dubbo.registries.registry-one.protocol=zookeeper
+dubbo.registries.registry-one.client=curator
+dubbo.registries.registry-one.address=localhost:2181
+
+dubbo.consumers.consumer-one.registryIds=registry-one
+dubbo.consumers.consumer-one.check=true
+dubbo.consumers.consumer-one.timeout=15000
+dubbo.consumers.consumer-one.injvm=false
+dubbo.consumers.consumer-one.group=group-one
+
+# registry-two
+dubbo.registries.registry-two.id=registry-two
+dubbo.registries.registry-two.protocol=zookeeper
+dubbo.registries.registry-two.client=curator
+dubbo.registries.registry-two.address=localhost:2182
+
+dubbo.consumers.consumer-two.registryIds=registry-two
+dubbo.consumers.consumer-two.check=true
+dubbo.consumers.consumer-two.timeout=15000
+dubbo.consumers.consumer-two.injvm=false
+dubbo.consumers.consumer-two.group=group-two
diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/issues/issue9172/provider.properties b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/issues/issue9172/provider.properties
new file mode 100644
index 0000000..4ad9b23
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/issues/issue9172/provider.properties
@@ -0,0 +1,24 @@
+dubbo.application.name=provider-app
+dubbo.application.owner=com.test
+dubbo.application.organization=test
+dubbo.application.logger=slf4j
+dubbo.application.compiler=javassist
+dubbo.application.qosEnable=false
+
+# registry-one
+dubbo.registries.registry-one.id=registry-one
+dubbo.registries.registry-one.protocol=zookeeper
+dubbo.registries.registry-one.client=curator
+dubbo.registries.registry-one.address=localhost:2181
+
+dubbo.providers.provider-one.registryIds=registry-one
+dubbo.providers.provider-one.group=group-one
+
+# registry-two
+dubbo.registries.registry-two.id=registry-two
+dubbo.registries.registry-two.protocol=zookeeper
+dubbo.registries.registry-two.client=curator
+dubbo.registries.registry-two.address=localhost:2182
+
+dubbo.providers.provider-two.registryIds=registry-two
+dubbo.providers.provider-two.group=group-two