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 <mercybl...@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