diff --git a/dubbo-spring-boot-autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBinding2AutoConfiguration.java b/dubbo-spring-boot-autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBinding2AutoConfiguration.java index 0b858f81c..35a92d439 100644 --- a/dubbo-spring-boot-autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBinding2AutoConfiguration.java +++ b/dubbo-spring-boot-autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBinding2AutoConfiguration.java @@ -21,26 +21,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.source.ConfigurationPropertySources; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; -import org.springframework.core.env.AbstractEnvironment; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.Environment; -import org.springframework.core.env.MapPropertySource; -import org.springframework.core.env.MutablePropertySources; -import org.springframework.core.env.PropertyResolver; -import java.util.Map; -import java.util.Set; - -import static com.alibaba.spring.util.PropertySourcesUtils.getSubProperties; -import static java.util.Collections.emptySet; -import static org.apache.dubbo.spring.boot.util.DubboUtils.BASE_PACKAGES_BEAN_NAME; -import static org.apache.dubbo.spring.boot.util.DubboUtils.BASE_PACKAGES_PROPERTY_NAME; import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX; -import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_SCAN_PREFIX; import static org.apache.dubbo.spring.boot.util.DubboUtils.RELAXED_DUBBO_CONFIG_BINDER_BEAN_NAME; import static org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_PROTOTYPE; @@ -56,32 +41,6 @@ @AutoConfigureBefore(DubboRelaxedBindingAutoConfiguration.class) public class DubboRelaxedBinding2AutoConfiguration { - public PropertyResolver dubboScanBasePackagesPropertyResolver(ConfigurableEnvironment environment) { - ConfigurableEnvironment propertyResolver = new AbstractEnvironment() { - @Override - protected void customizePropertySources(MutablePropertySources propertySources) { - Map dubboScanProperties = getSubProperties(environment.getPropertySources(), DUBBO_SCAN_PREFIX); - propertySources.addLast(new MapPropertySource("dubboScanProperties", dubboScanProperties)); - } - }; - ConfigurationPropertySources.attach(propertyResolver); - return propertyResolver; - } - - /** - * The bean is used to scan the packages of Dubbo Service classes - * - * @param environment {@link Environment} instance - * @return non-null {@link Set} - * @since 2.7.8 - */ - @ConditionalOnMissingBean(name = BASE_PACKAGES_BEAN_NAME) - @Bean(name = BASE_PACKAGES_BEAN_NAME) - public Set dubboBasePackages(ConfigurableEnvironment environment) { - PropertyResolver propertyResolver = dubboScanBasePackagesPropertyResolver(environment); - return propertyResolver.getProperty(BASE_PACKAGES_PROPERTY_NAME, Set.class, emptySet()); - } - @ConditionalOnMissingBean(name = RELAXED_DUBBO_CONFIG_BINDER_BEAN_NAME, value = ConfigurationBeanBinder.class) @Bean(RELAXED_DUBBO_CONFIG_BINDER_BEAN_NAME) @Scope(scopeName = SCOPE_PROTOTYPE) diff --git a/dubbo-spring-boot-autoconfigure/src/test/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBinding2AutoConfigurationTest.java b/dubbo-spring-boot-autoconfigure/src/test/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBinding2AutoConfigurationTest.java index aaa74c773..1b8cf0e35 100644 --- a/dubbo-spring-boot-autoconfigure/src/test/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBinding2AutoConfigurationTest.java +++ b/dubbo-spring-boot-autoconfigure/src/test/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBinding2AutoConfigurationTest.java @@ -17,9 +17,10 @@ package org.apache.dubbo.spring.boot.autoconfigure; import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor; -import org.apache.dubbo.config.spring.beans.factory.annotation.ServiceClassPostProcessor; import com.alibaba.spring.context.config.ConfigurationBeanBinder; +import org.apache.dubbo.config.spring.beans.factory.annotation.ServiceClassPostProcessor; +import org.apache.dubbo.spring.boot.util.DubboUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.ObjectProvider; @@ -29,15 +30,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; -import org.springframework.core.env.PropertyResolver; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.ClassUtils; -import java.util.Map; -import java.util.Set; - -import static org.apache.dubbo.spring.boot.util.DubboUtils.BASE_PACKAGES_BEAN_NAME; -import static org.apache.dubbo.spring.boot.util.DubboUtils.BASE_PACKAGES_PROPERTY_RESOLVER_BEAN_NAME; import static org.apache.dubbo.spring.boot.util.DubboUtils.RELAXED_DUBBO_CONFIG_BINDER_BEAN_NAME; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -54,10 +49,6 @@ @PropertySource(value = "classpath:/dubbo.properties") public class DubboRelaxedBinding2AutoConfigurationTest { - @Autowired - @Qualifier(BASE_PACKAGES_BEAN_NAME) - private Set packagesToScan; - @Autowired @Qualifier(RELAXED_DUBBO_CONFIG_BINDER_BEAN_NAME) private ConfigurationBeanBinder dubboConfigBinder; @@ -71,12 +62,11 @@ public class DubboRelaxedBinding2AutoConfigurationTest { @Autowired private Environment environment; - @Autowired - private Map environments; - @Test public void testBeans() { + assertEquals(1, DubboUtils.getScanBasePackage(environment).size()); + assertTrue(ClassUtils.isAssignableValue(BinderDubboConfigBinder.class, dubboConfigBinder)); assertNotNull(serviceClassPostProcessor); @@ -84,13 +74,6 @@ public void testBeans() { assertNotNull(referenceAnnotationBeanPostProcessor); assertNotNull(referenceAnnotationBeanPostProcessor.getIfAvailable()); - assertNotNull(environment); - assertNotNull(environments); - - - assertEquals(1, environments.size()); - - assertTrue(environments.containsValue(environment)); } } \ No newline at end of file diff --git a/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfiguration.java b/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfiguration.java index 7597fe200..5ed7ef234 100644 --- a/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfiguration.java +++ b/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfiguration.java @@ -23,14 +23,12 @@ import org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener; import org.apache.dubbo.config.spring.context.DubboLifecycleComponentApplicationListener; import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig; - +import org.apache.dubbo.spring.boot.util.DubboUtils; import org.springframework.beans.BeansException; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; @@ -38,10 +36,8 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; -import java.util.Set; - -import static org.apache.dubbo.spring.boot.util.DubboUtils.BASE_PACKAGES_BEAN_NAME; import static org.apache.dubbo.spring.boot.util.DubboUtils.BASE_PACKAGES_PROPERTY_NAME; import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX; import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_SCAN_PREFIX; @@ -65,15 +61,12 @@ public class DubboAutoConfiguration implements ApplicationContextAware, BeanDefi /** * Creates {@link ServiceClassPostProcessor} Bean * - * @param packagesToScan the packages to scan * @return {@link ServiceClassPostProcessor} */ @ConditionalOnProperty(prefix = DUBBO_SCAN_PREFIX, name = BASE_PACKAGES_PROPERTY_NAME) - @ConditionalOnBean(name = BASE_PACKAGES_BEAN_NAME) @Bean - public ServiceClassPostProcessor serviceClassPostProcessor(@Qualifier(BASE_PACKAGES_BEAN_NAME) - Set packagesToScan) { - return new ServiceClassPostProcessor(packagesToScan); + public ServiceClassPostProcessor serviceClassPostProcessor(Environment environment) { + return new ServiceClassPostProcessor(DubboUtils.getScanBasePackage(environment)); } @Override diff --git a/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBindingAutoConfiguration.java b/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBindingAutoConfiguration.java index fdd320936..5fccf3394 100644 --- a/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBindingAutoConfiguration.java +++ b/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboRelaxedBindingAutoConfiguration.java @@ -20,20 +20,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; -import org.springframework.core.env.Environment; -import org.springframework.core.env.PropertyResolver; -import java.util.Set; - -import static java.util.Collections.emptySet; -import static org.apache.dubbo.spring.boot.util.DubboUtils.BASE_PACKAGES_BEAN_NAME; -import static org.apache.dubbo.spring.boot.util.DubboUtils.BASE_PACKAGES_PROPERTY_NAME; import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX; -import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_SCAN_PREFIX; import static org.apache.dubbo.spring.boot.util.DubboUtils.RELAXED_DUBBO_CONFIG_BINDER_BEAN_NAME; import static org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_PROTOTYPE; @@ -45,24 +36,6 @@ @Configuration public class DubboRelaxedBindingAutoConfiguration { - public PropertyResolver dubboScanBasePackagesPropertyResolver(Environment environment) { - return new RelaxedPropertyResolver(environment, DUBBO_SCAN_PREFIX); - } - - /** - * The bean is used to scan the packages of Dubbo Service classes - * - * @param environment {@link Environment} instance - * @return non-null {@link Set} - * @since 2.7.8 - */ - @ConditionalOnMissingBean(name = BASE_PACKAGES_BEAN_NAME) - @Bean(name = BASE_PACKAGES_BEAN_NAME) - public Set dubboBasePackages(Environment environment) { - PropertyResolver propertyResolver = dubboScanBasePackagesPropertyResolver(environment); - return propertyResolver.getProperty(BASE_PACKAGES_PROPERTY_NAME, Set.class, emptySet()); - } - @ConditionalOnMissingBean(name = RELAXED_DUBBO_CONFIG_BINDER_BEAN_NAME, value = ConfigurationBeanBinder.class) @Bean(RELAXED_DUBBO_CONFIG_BINDER_BEAN_NAME) @Scope(scopeName = SCOPE_PROTOTYPE) diff --git a/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/util/DubboUtils.java b/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/util/DubboUtils.java index 4e6505cfa..b0bcf02f9 100644 --- a/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/util/DubboUtils.java +++ b/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/util/DubboUtils.java @@ -22,8 +22,10 @@ import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig; import org.apache.dubbo.config.spring.context.properties.DubboConfigBinder; +import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.ContextIdApplicationContextInitializer; import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; import org.springframework.core.env.PropertyResolver; import java.util.Collections; @@ -32,6 +34,8 @@ import java.util.SortedMap; import java.util.TreeMap; +import static java.util.Collections.emptySet; + /** * The utilities class for Dubbo * @@ -212,4 +216,20 @@ public static SortedMap filterDubboProperties(ConfigurableEnviro return Collections.unmodifiableSortedMap(dubboProperties); } + public static Set getScanBasePackage(Environment environment) { + // spring-boot 2.x Environment support relaxed properties + String name = DUBBO_SCAN_PREFIX + BASE_PACKAGES_PROPERTY_NAME; + Set packagesToScan = environment.getProperty(name, Set.class, emptySet()); + + //read relaxed properties compatible with spring-boot 1.x + if (packagesToScan == null || packagesToScan.isEmpty()) { + try { + RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(environment, DUBBO_SCAN_PREFIX); + packagesToScan = propertyResolver.getProperty(BASE_PACKAGES_PROPERTY_NAME, Set.class, emptySet()); + } catch (NoClassDefFoundError ex) { + //ignore + } + } + return packagesToScan; + } } diff --git a/dubbo-spring-boot-compatible/autoconfigure/src/test/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfigurationOnSingleConfigTest.java b/dubbo-spring-boot-compatible/autoconfigure/src/test/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfigurationOnSingleConfigTest.java index 26fb6bd50..0ed37df44 100644 --- a/dubbo-spring-boot-compatible/autoconfigure/src/test/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfigurationOnSingleConfigTest.java +++ b/dubbo-spring-boot-compatible/autoconfigure/src/test/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfigurationOnSingleConfigTest.java @@ -46,7 +46,7 @@ @RunWith(SpringRunner.class) @TestPropertySource( properties = { - "dubbo.application.name = dubbo-demo-application", + "dubbo.application.NAME = dubbo-demo-application", "dubbo.module.name = dubbo-demo-module", "dubbo.registry.address = zookeeper://192.168.99.100:32770", "dubbo.protocol.name=dubbo",