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
This commit is contained in:
Yanming Zhou
2024-09-13 10:24:14 +08:00
committed by Phillip Webb
parent 3723a9e040
commit 44be2e11d9
2 changed files with 21 additions and 2 deletions

View File

@@ -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;
*
* @author Madhura Bhave
* @author Phillip Webb
* @author Yanming Zhou
*/
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) {

View File

@@ -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;
* @author Madhura Bhave
* @author Stephane Nicoll
* @author Phillip Webb
* @author Yanming Zhou
*/
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 {
}
@ConfigurationProperties(prefix = "beancp")
@Primary
static class PrimaryConfigurationProperties {
}
static class NoAnnotationConfigurationProperties {
}