You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by me...@apache.org on 2019/09/23 02:17:37 UTC

[dubbo] branch 2.7.4-release updated: [Feature] Using the ID of Dubbo Config as the alias of Bean (#5094)

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

mercyblitz pushed a commit to branch 2.7.4-release
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/2.7.4-release by this push:
     new 7f5e9df  [Feature] Using the ID of Dubbo Config as the alias of Bean  (#5094)
7f5e9df is described below

commit 7f5e9df73a5b13f943b900f39e8e95d8b5c44a64
Author: Mercy Ma <me...@gmail.com>
AuthorDate: Mon Sep 23 10:17:23 2019 +0800

    [Feature] Using the ID of Dubbo Config as the alias of Bean  (#5094)
    
    * Polish /apache/dubbo#4687 : Remove the duplicated test code in dubbo-config-spring
    
    * Polish /apache/dubbo#4674 & /apache/dubbo#4470
    
    * Polish /apache/dubbo#5093 : Revert the previous commit
    
    * Polish apache/dubbo#5093 : [Feature] Dubbo Services generate the metadata of REST services
---
 .../annotation/DubboConfigAliasPostProcessor.java  | 74 ++++++++++++++++++++++
 .../DubboConfigBindingBeanPostProcessor.java       | 30 +--------
 .../DubboConfigConfigurationRegistrar.java         | 15 +++++
 .../spring/schema/DubboBeanDefinitionParser.java   | 17 ++++-
 .../dubbo/config/spring/util/BeanRegistrar.java    | 15 +++++
 .../DubboConfigBindingBeanPostProcessorTest.java   | 16 -----
 .../context/annotation/EnableDubboConfigTest.java  | 12 ++++
 7 files changed, 133 insertions(+), 46 deletions(-)

diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigAliasPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigAliasPostProcessor.java
new file mode 100644
index 0000000..ddbcbf0
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigAliasPostProcessor.java
@@ -0,0 +1,74 @@
+/*
+ * 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.beans.factory.annotation;
+
+import org.apache.dubbo.config.AbstractConfig;
+import org.apache.dubbo.config.spring.context.annotation.DubboConfigConfigurationRegistrar;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
+
+import static org.apache.dubbo.config.spring.util.BeanRegistrar.hasAlias;
+import static org.springframework.util.ObjectUtils.nullSafeEquals;
+import static org.springframework.util.StringUtils.hasText;
+
+/**
+ * A Post-Processor class to set the alias of Dubbo Config bean using its {@link AbstractConfig#getId()}
+ *
+ * @since 2.7.4
+ */
+public class DubboConfigAliasPostProcessor implements BeanDefinitionRegistryPostProcessor, BeanPostProcessor {
+
+    /**
+     * The bean name of {@link DubboConfigConfigurationRegistrar}
+     */
+    public final static String BEAN_NAME = "dubboConfigAliasPostProcessor";
+
+    private BeanDefinitionRegistry registry;
+
+    @Override
+    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
+        this.registry = registry;
+    }
+
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+        // DO NOTHING
+    }
+
+    @Override
+    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+        // DO NOTHING
+        return bean;
+    }
+
+    @Override
+    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+        if (bean instanceof AbstractConfig) {
+            String id = ((AbstractConfig) bean).getId();
+            if (hasText(id)                                     // id MUST be present in AbstractConfig
+                    && !nullSafeEquals(id, beanName)            // id MUST NOT be equal to bean name
+                    && !hasAlias(registry, beanName, id)) {     // id MUST NOT be present in AliasRegistry
+                registry.registerAlias(beanName, id);
+            }
+        }
+        return bean;
+    }
+}
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java
index 9b181cb..64327b7 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java
@@ -17,7 +17,6 @@
 package org.apache.dubbo.config.spring.beans.factory.annotation;
 
 import org.apache.dubbo.common.utils.Assert;
-import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.AbstractConfig;
 import org.apache.dubbo.config.spring.context.annotation.DubboConfigBindingRegistrar;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfigBinding;
@@ -30,10 +29,6 @@ import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import org.springframework.beans.factory.support.BeanDefinitionRegistry;
-import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
-import org.springframework.beans.factory.support.DefaultListableBeanFactory;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.core.annotation.AnnotationAwareOrderComparator;
@@ -54,8 +49,7 @@ import static org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncl
  * @since 2.5.8
  */
 
-public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware, InitializingBean
-        , BeanDefinitionRegistryPostProcessor {
+public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware, InitializingBean {
 
     private final Log log = LogFactory.getLog(getClass());
 
@@ -73,8 +67,6 @@ public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, A
 
     private ApplicationContext applicationContext;
 
-    private BeanDefinitionRegistry beanDefinitionRegistry;
-
     private boolean ignoreUnknownFields = true;
 
     private boolean ignoreInvalidFields = true;
@@ -153,15 +145,6 @@ public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, A
 
     @Override
     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-        if (bean instanceof AbstractConfig) {
-            String id = ((AbstractConfig) bean).getId();
-            if (beanDefinitionRegistry != null && beanDefinitionRegistry instanceof DefaultListableBeanFactory) {
-                DefaultListableBeanFactory factory = (DefaultListableBeanFactory) beanDefinitionRegistry;
-                if (!StringUtils.isBlank(id) && !factory.hasAlias(beanName, id)) {
-                    beanDefinitionRegistry.registerAlias(beanName, id);
-                }
-            }
-        }
         return bean;
     }
 
@@ -220,15 +203,4 @@ public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, A
         return defaultDubboConfigBinder;
     }
 
-    @Override
-    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
-        if (this.beanDefinitionRegistry == null) {
-            this.beanDefinitionRegistry = registry;
-        }
-    }
-
-    @Override
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
-        //do nothing here
-    }
 }
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationRegistrar.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationRegistrar.java
index c1bec4a..18f260a 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationRegistrar.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationRegistrar.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config.spring.context.annotation;
 
 import org.apache.dubbo.config.AbstractConfig;
+import org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigAliasPostProcessor;
 
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
@@ -25,6 +26,7 @@ import org.springframework.core.annotation.AnnotationAttributes;
 import org.springframework.core.type.AnnotationMetadata;
 
 import static org.apache.dubbo.config.spring.util.AnnotatedBeanDefinitionRegistryUtils.registerBeans;
+import static org.apache.dubbo.config.spring.util.BeanRegistrar.registerInfrastructureBean;
 
 /**
  * Dubbo {@link AbstractConfig Config} {@link ImportBeanDefinitionRegistrar register}, which order can be configured
@@ -50,6 +52,19 @@ public class DubboConfigConfigurationRegistrar implements ImportBeanDefinitionRe
         if (multiple) { // Since 2.6.6 https://github.com/apache/dubbo/issues/3193
             registerBeans(registry, DubboConfigConfiguration.Multiple.class);
         }
+
+        // Register DubboConfigAliasPostProcessor
+        registerDubboConfigAliasPostProcessor(registry);
+    }
+
+    /**
+     * Register {@link DubboConfigAliasPostProcessor}
+     *
+     * @param registry {@link BeanDefinitionRegistry}
+     * @since 2.7.4 [Feature] https://github.com/apache/dubbo/issues/5093
+     */
+    private void registerDubboConfigAliasPostProcessor(BeanDefinitionRegistry registry) {
+        registerInfrastructureBean(registry, DubboConfigAliasPostProcessor.BEAN_NAME, DubboConfigAliasPostProcessor.class);
     }
 
 }
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 0f428d8..565d4ec 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
@@ -28,12 +28,14 @@ import org.apache.dubbo.config.ProviderConfig;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.spring.ReferenceBean;
 import org.apache.dubbo.config.spring.ServiceBean;
+import org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigAliasPostProcessor;
 
 import org.springframework.beans.PropertyValue;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.config.BeanDefinitionHolder;
 import org.springframework.beans.factory.config.RuntimeBeanReference;
 import org.springframework.beans.factory.config.TypedStringValue;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.beans.factory.support.ManagedList;
 import org.springframework.beans.factory.support.ManagedMap;
 import org.springframework.beans.factory.support.RootBeanDefinition;
@@ -52,6 +54,7 @@ import java.util.Set;
 import java.util.regex.Pattern;
 
 import static org.apache.dubbo.common.constants.CommonConstants.HIDE_KEY_PREFIX;
+import static org.apache.dubbo.config.spring.util.BeanRegistrar.registerInfrastructureBean;
 
 /**
  * AbstractBeanDefinitionParser
@@ -194,7 +197,7 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser {
                                         value = null;
                                     }
                                     reference = value;
-                                } else if(ONRETURN.equals(property) || ONTHROW.equals(property) || ONINVOKE.equals(property)) {
+                                } else if (ONRETURN.equals(property) || ONTHROW.equals(property) || ONINVOKE.equals(property)) {
                                     int index = value.lastIndexOf(".");
                                     String ref = value.substring(0, index);
                                     String method = value.substring(index + 1);
@@ -390,7 +393,19 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser {
 
     @Override
     public BeanDefinition parse(Element element, ParserContext parserContext) {
+        // Register DubboConfigAliasPostProcessor
+        registerDubboConfigAliasPostProcessor(parserContext.getRegistry());
+
         return parse(element, parserContext, beanClass, required);
     }
 
+    /**
+     * Register {@link DubboConfigAliasPostProcessor}
+     *
+     * @param registry {@link BeanDefinitionRegistry}
+     * @since 2.7.4 [Feature] https://github.com/apache/dubbo/issues/5093
+     */
+    private void registerDubboConfigAliasPostProcessor(BeanDefinitionRegistry registry) {
+        registerInfrastructureBean(registry, DubboConfigAliasPostProcessor.BEAN_NAME, DubboConfigAliasPostProcessor.class);
+    }
 }
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanRegistrar.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanRegistrar.java
index ac4176b..04dd601 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanRegistrar.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanRegistrar.java
@@ -19,6 +19,10 @@ package org.apache.dubbo.config.spring.util;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.beans.factory.support.RootBeanDefinition;
+import org.springframework.core.AliasRegistry;
+
+import static org.springframework.util.ObjectUtils.containsElement;
+import static org.springframework.util.StringUtils.hasText;
 
 /**
  * Bean Registrar
@@ -46,4 +50,15 @@ public class BeanRegistrar {
 
     }
 
+    /**
+     * Detect the alias is present or not in the given bean name from {@link AliasRegistry}
+     *
+     * @param registry {@link AliasRegistry}
+     * @param beanName the bean name
+     * @param alias    alias to test
+     * @return if present, return <code>true</code>, or <code>false</code>
+     */
+    public static boolean hasAlias(AliasRegistry registry, String beanName, String alias) {
+        return hasText(beanName) && hasText(alias) && containsElement(registry.getAliases(beanName), alias);
+    }
 }
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessorTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessorTest.java
index 301c1d9..62a9a26 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessorTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessorTest.java
@@ -17,7 +17,6 @@
 package org.apache.dubbo.config.spring.beans.factory.annotation;
 
 import org.apache.dubbo.config.ApplicationConfig;
-import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.spring.context.config.NamePropertyDefaultValueDubboConfigBeanCustomizer;
 import org.apache.dubbo.config.spring.context.properties.DefaultDubboConfigBinder;
 
@@ -53,14 +52,6 @@ public class DubboConfigBindingBeanPostProcessorTest {
         return new ApplicationConfig();
     }
 
-    @Bean("dubbo-demo-protocol")
-    public ProtocolConfig protocolConfig() {
-        ProtocolConfig protocolConfig = new ProtocolConfig();
-        protocolConfig.setName("dubbo");
-        protocolConfig.setId("customConfigAlias");
-        return protocolConfig;
-    }
-
     @Bean
     public DubboConfigBindingBeanPostProcessor bindingBeanPostProcessor() {
         return new DubboConfigBindingBeanPostProcessor("dubbo.application", "dubbo-demo-application");
@@ -74,15 +65,8 @@ public class DubboConfigBindingBeanPostProcessorTest {
 
         ApplicationConfig applicationConfig = applicationContext.getBean(ApplicationConfig.class);
 
-        String[] aliases = applicationContext.getAliases("dubbo-demo-protocol");
-        ProtocolConfig protocolConfigByName = applicationContext.getBean("dubbo-demo-protocol", ProtocolConfig.class);
-        ProtocolConfig protocolConfigById = applicationContext.getBean(protocolConfigByName.getId(), ProtocolConfig.class);
-
         Assert.assertEquals("dubbo-demo-application", applicationConfig.getName());
         Assert.assertEquals("mercyblitz", applicationConfig.getOwner());
         Assert.assertEquals("Apache", applicationConfig.getOrganization());
-
-        Assert.assertArrayEquals(new String[]{"customConfigAlias"}, aliases);
-        Assert.assertEquals(protocolConfigByName, protocolConfigById);
     }
 }
\ No newline at end of file
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigTest.java
index 559553e..3086600 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigTest.java
@@ -32,6 +32,10 @@ import org.springframework.context.annotation.PropertySource;
 
 import java.util.Map;
 
+import static org.apache.dubbo.config.spring.util.BeanRegistrar.hasAlias;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 /**
  * {@link EnableDubboConfig} Test
  *
@@ -76,6 +80,9 @@ public class EnableDubboConfigTest {
         ConsumerConfig consumerConfig = context.getBean(ConsumerConfig.class);
         Assertions.assertEquals("netty", consumerConfig.getClient());
 
+        // asserts aliases
+        assertTrue(hasAlias(context, "org.apache.dubbo.config.RegistryConfig#0", "zookeeper"));
+        assertFalse(hasAlias(context, "org.apache.dubbo.config.MonitorConfig#0", "zookeeper"));
     }
 
     @Test
@@ -89,6 +96,7 @@ public class EnableDubboConfigTest {
         ApplicationConfig applicationConfig = context.getBean("applicationBean", ApplicationConfig.class);
         Assertions.assertEquals("dubbo-demo-application", applicationConfig.getName());
 
+
         ApplicationConfig applicationBean2 = context.getBean("applicationBean2", ApplicationConfig.class);
         Assertions.assertEquals("dubbo-demo-application2", applicationBean2.getName());
 
@@ -103,6 +111,10 @@ public class EnableDubboConfigTest {
             Assert.assertEquals(beanName, protocol.getName());
         }
 
+        // asserts aliases
+        assertTrue(hasAlias(context, "applicationBean2", "dubbo-demo-application2"));
+        assertTrue(hasAlias(context, "applicationBean3", "dubbo-demo-application3"));
+
     }
 
     @EnableDubboConfig