diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar.java new file mode 100644 index 0000000000..5a9e5f1310 --- /dev/null +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar.java @@ -0,0 +1,60 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed 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 + * + * https://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.springframework.boot.context.properties; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.type.AnnotationMetadata; +import org.springframework.util.MultiValueMap; + +/** + * {@link ImportBeanDefinitionRegistrar} for configuration properties support. + * + * @author Dave Syer + * @author Christian Dupuis + * @author Stephane Nicoll + */ +class ConfigurationPropertiesBeanRegistrar implements ImportBeanDefinitionRegistrar { + + @Override + public void registerBeanDefinitions(AnnotationMetadata metadata, + BeanDefinitionRegistry registry) { + ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory) registry; + getTypes(metadata) + .forEach((type) -> ConfigurationPropertiesBeanDefinitionRegistrar + .register(registry, beanFactory, type)); + } + + private List> getTypes(AnnotationMetadata metadata) { + MultiValueMap attributes = metadata.getAllAnnotationAttributes( + EnableConfigurationProperties.class.getName(), false); + return collectClasses( + (attributes != null) ? attributes.get("value") : Collections.emptyList()); + } + + private List> collectClasses(List values) { + return values.stream().flatMap((value) -> Arrays.stream((Class[]) value)) + .filter((type) -> void.class != type).collect(Collectors.toList()); + } + +} diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/EnableConfigurationProperties.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/EnableConfigurationProperties.java index ad7967bfa0..91a9609fe7 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/EnableConfigurationProperties.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/EnableConfigurationProperties.java @@ -36,7 +36,8 @@ import org.springframework.context.annotation.Import; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented -@Import(EnableConfigurationPropertiesImportSelector.class) +@Import({ ConfigurationPropertiesBeanRegistrar.class, + ConfigurationPropertiesBindingPostProcessorRegistrar.class }) public @interface EnableConfigurationProperties { /** diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/EnableConfigurationPropertiesImportSelector.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/EnableConfigurationPropertiesImportSelector.java deleted file mode 100644 index 43c0c7da2f..0000000000 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/EnableConfigurationPropertiesImportSelector.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2012-2019 the original author or authors. - * - * Licensed 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 - * - * https://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.springframework.boot.context.properties; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; -import org.springframework.context.annotation.ImportSelector; -import org.springframework.core.type.AnnotationMetadata; -import org.springframework.util.MultiValueMap; - -/** - * Import selector that sets up binding of external properties to configuration classes - * (see {@link ConfigurationProperties}). It either registers a - * {@link ConfigurationProperties} bean or not, depending on whether the enclosing - * {@link EnableConfigurationProperties} explicitly declares one. If none is declared then - * a bean post processor will still kick in for any beans annotated as external - * configuration. If one is declared, then a bean definition is registered with id equal - * to the class name (thus an application context usually only contains one - * {@link ConfigurationProperties} bean of each unique type). - * - * @author Dave Syer - * @author Christian Dupuis - * @author Stephane Nicoll - */ -class EnableConfigurationPropertiesImportSelector implements ImportSelector { - - private static final String[] IMPORTS = { - ConfigurationPropertiesBeanRegistrar.class.getName(), - ConfigurationPropertiesBindingPostProcessorRegistrar.class.getName() }; - - @Override - public String[] selectImports(AnnotationMetadata metadata) { - return IMPORTS; - } - - /** - * {@link ImportBeanDefinitionRegistrar} for configuration properties support. - */ - public static class ConfigurationPropertiesBeanRegistrar - implements ImportBeanDefinitionRegistrar { - - @Override - public void registerBeanDefinitions(AnnotationMetadata metadata, - BeanDefinitionRegistry registry) { - ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory) registry; - getTypes(metadata) - .forEach((type) -> ConfigurationPropertiesBeanDefinitionRegistrar - .register(registry, beanFactory, type)); - } - - private List> getTypes(AnnotationMetadata metadata) { - MultiValueMap attributes = metadata - .getAllAnnotationAttributes( - EnableConfigurationProperties.class.getName(), false); - return collectClasses((attributes != null) ? attributes.get("value") - : Collections.emptyList()); - } - - private List> collectClasses(List values) { - return values.stream().flatMap((value) -> Arrays.stream((Class[]) value)) - .filter((type) -> void.class != type).collect(Collectors.toList()); - } - - } - -} diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/EnableConfigurationPropertiesImportSelectorTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrarTests.java similarity index 77% rename from spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/EnableConfigurationPropertiesImportSelectorTests.java rename to spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrarTests.java index c2a33e0f0f..e948780bad 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/EnableConfigurationPropertiesImportSelectorTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrarTests.java @@ -29,43 +29,30 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; /** - * Tests for {@link EnableConfigurationPropertiesImportSelector}. + * Tests for {@link ConfigurationPropertiesBeanRegistrar}. * * @author Madhura Bhave * @author Stephane Nicoll */ -public class EnableConfigurationPropertiesImportSelectorTests { +public class ConfigurationPropertiesBeanRegistrarTests { - private final EnableConfigurationPropertiesImportSelector importSelector = new EnableConfigurationPropertiesImportSelector(); - - private final EnableConfigurationPropertiesImportSelector.ConfigurationPropertiesBeanRegistrar registrar = new EnableConfigurationPropertiesImportSelector.ConfigurationPropertiesBeanRegistrar(); + private final ConfigurationPropertiesBeanRegistrar registrar = new ConfigurationPropertiesBeanRegistrar(); private final DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); - @Test - public void selectImports() { - String[] imports = this.importSelector - .selectImports(mock(AnnotationMetadata.class)); - assertThat(imports).containsExactly( - EnableConfigurationPropertiesImportSelector.ConfigurationPropertiesBeanRegistrar.class - .getName(), - ConfigurationPropertiesBindingPostProcessorRegistrar.class.getName()); - } - @Test public void typeWithDefaultConstructorShouldRegisterGenericBeanDefinition() throws Exception { this.registrar.registerBeanDefinitions( getAnnotationMetadata(TestConfiguration.class), this.beanFactory); BeanDefinition beanDefinition = this.beanFactory.getBeanDefinition( - "foo-org.springframework.boot.context.properties.EnableConfigurationPropertiesImportSelectorTests$FooProperties"); + "foo-org.springframework.boot.context.properties.ConfigurationPropertiesBeanRegistrarTests$FooProperties"); assertThat(beanDefinition).isExactlyInstanceOf(GenericBeanDefinition.class); } @@ -75,7 +62,7 @@ public class EnableConfigurationPropertiesImportSelectorTests { this.registrar.registerBeanDefinitions( getAnnotationMetadata(TestConfiguration.class), this.beanFactory); BeanDefinition beanDefinition = this.beanFactory.getBeanDefinition( - "bar-org.springframework.boot.context.properties.EnableConfigurationPropertiesImportSelectorTests$BarProperties"); + "bar-org.springframework.boot.context.properties.ConfigurationPropertiesBeanRegistrarTests$BarProperties"); assertThat(beanDefinition) .isExactlyInstanceOf(ConfigurationPropertiesBeanDefinition.class); } @@ -86,7 +73,7 @@ public class EnableConfigurationPropertiesImportSelectorTests { this.registrar.registerBeanDefinitions( getAnnotationMetadata(TestConfiguration.class), this.beanFactory); BeanDefinition beanDefinition = this.beanFactory.getBeanDefinition( - "bing-org.springframework.boot.context.properties.EnableConfigurationPropertiesImportSelectorTests$BingProperties"); + "bing-org.springframework.boot.context.properties.ConfigurationPropertiesBeanRegistrarTests$BingProperties"); assertThat(beanDefinition).isExactlyInstanceOf(GenericBeanDefinition.class); } @@ -98,7 +85,7 @@ public class EnableConfigurationPropertiesImportSelectorTests { this.beanFactory)) .withMessageContaining("No ConfigurationProperties annotation found") .withMessageContaining( - EnableConfigurationPropertiesImportSelectorTests.class.getName()); + ConfigurationPropertiesBeanRegistrar.class.getName()); } @Test @@ -129,7 +116,7 @@ public class EnableConfigurationPropertiesImportSelectorTests { } - @EnableConfigurationProperties(EnableConfigurationPropertiesImportSelectorTests.class) + @EnableConfigurationProperties(ConfigurationPropertiesBeanRegistrarTests.class) static class InvalidConfiguration { } diff --git a/spring-boot-project/spring-boot/src/test/kotlin/org/springframework/boot/context/properties/KotlinEnableConfigurationPropertiesImportSelectorTests.kt b/spring-boot-project/spring-boot/src/test/kotlin/org/springframework/boot/context/properties/KotlinConfigurationPropertiesBeanRegistrarTests.kt similarity index 78% rename from spring-boot-project/spring-boot/src/test/kotlin/org/springframework/boot/context/properties/KotlinEnableConfigurationPropertiesImportSelectorTests.kt rename to spring-boot-project/spring-boot/src/test/kotlin/org/springframework/boot/context/properties/KotlinConfigurationPropertiesBeanRegistrarTests.kt index 765089e7f6..11734e129d 100644 --- a/spring-boot-project/spring-boot/src/test/kotlin/org/springframework/boot/context/properties/KotlinEnableConfigurationPropertiesImportSelectorTests.kt +++ b/spring-boot-project/spring-boot/src/test/kotlin/org/springframework/boot/context/properties/KotlinConfigurationPropertiesBeanRegistrarTests.kt @@ -8,14 +8,14 @@ import org.springframework.core.type.AnnotationMetadata import org.springframework.core.type.classreading.SimpleMetadataReaderFactory /** - * Tests for `EnableConfigurationPropertiesImportSelector`. + * Tests for `ConfigurationPropertiesBeanRegistrar`. * * @author Stephane Nicoll */ @Suppress("unused") -class KotlinEnableConfigurationPropertiesImportSelectorTests { +class KotlinConfigurationPropertiesBeanRegistrarTests { - private val registrar = EnableConfigurationPropertiesImportSelector.ConfigurationPropertiesBeanRegistrar() + private val registrar = ConfigurationPropertiesBeanRegistrar() private val beanFactory = DefaultListableBeanFactory() @@ -24,7 +24,7 @@ class KotlinEnableConfigurationPropertiesImportSelectorTests { this.registrar.registerBeanDefinitions( getAnnotationMetadata(TestConfiguration::class.java), this.beanFactory) val beanDefinition = this.beanFactory.getBeanDefinition( - "foo-org.springframework.boot.context.properties.KotlinEnableConfigurationPropertiesImportSelectorTests\$FooProperties") + "foo-org.springframework.boot.context.properties.KotlinConfigurationPropertiesBeanRegistrarTests\$FooProperties") assertThat(beanDefinition).isExactlyInstanceOf(GenericBeanDefinition::class.java) } @@ -33,7 +33,7 @@ class KotlinEnableConfigurationPropertiesImportSelectorTests { this.registrar.registerBeanDefinitions( getAnnotationMetadata(TestConfiguration::class.java), this.beanFactory) val beanDefinition = this.beanFactory.getBeanDefinition( - "bar-org.springframework.boot.context.properties.KotlinEnableConfigurationPropertiesImportSelectorTests\$BarProperties") + "bar-org.springframework.boot.context.properties.KotlinConfigurationPropertiesBeanRegistrarTests\$BarProperties") assertThat(beanDefinition).isExactlyInstanceOf( ConfigurationPropertiesBeanDefinition::class.java) } @@ -43,7 +43,7 @@ class KotlinEnableConfigurationPropertiesImportSelectorTests { this.registrar.registerBeanDefinitions( getAnnotationMetadata(TestConfiguration::class.java), this.beanFactory) val beanDefinition = this.beanFactory.getBeanDefinition( - "bing-org.springframework.boot.context.properties.KotlinEnableConfigurationPropertiesImportSelectorTests\$BingProperties") + "bing-org.springframework.boot.context.properties.KotlinConfigurationPropertiesBeanRegistrarTests\$BingProperties") assertThat(beanDefinition).isExactlyInstanceOf(GenericBeanDefinition::class.java) }