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