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 index ed5add358a95..0831d13cb7ec 100644 --- 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 @@ -23,8 +23,8 @@ import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.boot.context.properties.bind.BindMethod; +import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.AnnotationScopeMetadataResolver; import org.springframework.context.annotation.ScopeMetadata; import org.springframework.context.annotation.ScopeMetadataResolver; @@ -42,6 +42,7 @@ * * @author Madhura Bhave * @author Phillip Webb + * @author Yanming Zhou */ final class ConfigurationPropertiesBeanRegistrar { @@ -88,7 +89,8 @@ private void registerBeanDefinition(String beanName, Class type, } private BeanDefinitionHolder createBeanDefinition(String beanName, Class type) { - GenericBeanDefinition definition = new AnnotatedGenericBeanDefinition(type); + AnnotatedGenericBeanDefinition definition = new AnnotatedGenericBeanDefinition(type); + AnnotationConfigUtils.processCommonDefinitionAnnotations(definition); BindMethod bindMethod = ConfigurationPropertiesBean.deduceBindMethod(type); BindMethodAttribute.set(definition, bindMethod); if (bindMethod == BindMethod.VALUE_OBJECT) { diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrarTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrarTests.java index 3680387a69bf..4379dd14548e 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrarTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrarTests.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.boot.context.properties.bind.BindMethod; +import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; @@ -38,6 +39,7 @@ * @author Madhura Bhave * @author Stephane Nicoll * @author Phillip Webb + * @author Yanming Zhou */ class ConfigurationPropertiesBeanRegistrarTests { @@ -122,6 +124,15 @@ void registerScopedBeanDefinitionWithProxyMode() { assertThat(beanDefinition.getScope()).isEqualTo(BeanDefinition.SCOPE_PROTOTYPE); } + @Test + void registerBeanDefinitionWithCommonDefinitionAnnotations() { + String beanName = "beancp-" + PrimaryConfigurationProperties.class.getName(); + this.registrar.register(PrimaryConfigurationProperties.class); + BeanDefinition beanDefinition = this.registry.getBeanDefinition(beanName); + assertThat(beanDefinition).isNotNull(); + assertThat(beanDefinition.isPrimary()).isEqualTo(true); + } + private Consumer hasBindMethodAttribute(BindMethod bindMethod) { return (definition) -> { assertThat(definition.hasAttribute(BindMethod.class.getName())).isTrue(); @@ -146,6 +157,12 @@ static class ProxyScopedBeanConfigurationProperties { } + @ConfigurationProperties(prefix = "beancp") + @Primary + static class PrimaryConfigurationProperties { + + } + static class NoAnnotationConfigurationProperties { }