Browse Source

Add common definition annotations support for ConfigurationProperties

Update `` to ensure that common bean definition annotations, such as
`@Lazy`, `@Primary` and `@Fallback`, are applied.

See gh-42289
pull/42311/head
Yanming Zhou 1 year ago committed by Phillip Webb
parent
commit
44be2e11d9
  1. 6
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar.java
  2. 17
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrarTests.java

6
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar.java

@ -23,8 +23,8 @@ import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefiniti @@ -23,8 +23,8 @@ import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefiniti
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 @@ import org.springframework.util.StringUtils; @@ -42,6 +42,7 @@ import org.springframework.util.StringUtils;
*
* @author Madhura Bhave
* @author Phillip Webb
* @author Yanming Zhou
*/
final class ConfigurationPropertiesBeanRegistrar {
@ -88,7 +89,8 @@ final class ConfigurationPropertiesBeanRegistrar { @@ -88,7 +89,8 @@ final class ConfigurationPropertiesBeanRegistrar {
}
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) {

17
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.BeanDefinitionRegistry; @@ -26,6 +26,7 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry;
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 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException; @@ -38,6 +39,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
* @author Madhura Bhave
* @author Stephane Nicoll
* @author Phillip Webb
* @author Yanming Zhou
*/
class ConfigurationPropertiesBeanRegistrarTests {
@ -122,6 +124,15 @@ class ConfigurationPropertiesBeanRegistrarTests { @@ -122,6 +124,15 @@ class ConfigurationPropertiesBeanRegistrarTests {
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<BeanDefinition> hasBindMethodAttribute(BindMethod bindMethod) {
return (definition) -> {
assertThat(definition.hasAttribute(BindMethod.class.getName())).isTrue();
@ -146,6 +157,12 @@ class ConfigurationPropertiesBeanRegistrarTests { @@ -146,6 +157,12 @@ class ConfigurationPropertiesBeanRegistrarTests {
}
@ConfigurationProperties(prefix = "beancp")
@Primary
static class PrimaryConfigurationProperties {
}
static class NoAnnotationConfigurationProperties {
}

Loading…
Cancel
Save