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:
committed by
Phillip Webb
parent
3723a9e040
commit
44be2e11d9
@@ -23,8 +23,8 @@ import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefiniti
|
|||||||
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
|
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
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.boot.context.properties.bind.BindMethod;
|
||||||
|
import org.springframework.context.annotation.AnnotationConfigUtils;
|
||||||
import org.springframework.context.annotation.AnnotationScopeMetadataResolver;
|
import org.springframework.context.annotation.AnnotationScopeMetadataResolver;
|
||||||
import org.springframework.context.annotation.ScopeMetadata;
|
import org.springframework.context.annotation.ScopeMetadata;
|
||||||
import org.springframework.context.annotation.ScopeMetadataResolver;
|
import org.springframework.context.annotation.ScopeMetadataResolver;
|
||||||
@@ -42,6 +42,7 @@ import org.springframework.util.StringUtils;
|
|||||||
*
|
*
|
||||||
* @author Madhura Bhave
|
* @author Madhura Bhave
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
|
* @author Yanming Zhou
|
||||||
*/
|
*/
|
||||||
final class ConfigurationPropertiesBeanRegistrar {
|
final class ConfigurationPropertiesBeanRegistrar {
|
||||||
|
|
||||||
@@ -88,7 +89,8 @@ final class ConfigurationPropertiesBeanRegistrar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private BeanDefinitionHolder createBeanDefinition(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);
|
BindMethod bindMethod = ConfigurationPropertiesBean.deduceBindMethod(type);
|
||||||
BindMethodAttribute.set(definition, bindMethod);
|
BindMethodAttribute.set(definition, bindMethod);
|
||||||
if (bindMethod == BindMethod.VALUE_OBJECT) {
|
if (bindMethod == BindMethod.VALUE_OBJECT) {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
|||||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
||||||
import org.springframework.beans.factory.support.GenericBeanDefinition;
|
import org.springframework.beans.factory.support.GenericBeanDefinition;
|
||||||
import org.springframework.boot.context.properties.bind.BindMethod;
|
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.Scope;
|
||||||
import org.springframework.context.annotation.ScopedProxyMode;
|
import org.springframework.context.annotation.ScopedProxyMode;
|
||||||
|
|
||||||
@@ -38,6 +39,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
|
|||||||
* @author Madhura Bhave
|
* @author Madhura Bhave
|
||||||
* @author Stephane Nicoll
|
* @author Stephane Nicoll
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
|
* @author Yanming Zhou
|
||||||
*/
|
*/
|
||||||
class ConfigurationPropertiesBeanRegistrarTests {
|
class ConfigurationPropertiesBeanRegistrarTests {
|
||||||
|
|
||||||
@@ -122,6 +124,15 @@ class ConfigurationPropertiesBeanRegistrarTests {
|
|||||||
assertThat(beanDefinition.getScope()).isEqualTo(BeanDefinition.SCOPE_PROTOTYPE);
|
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) {
|
private Consumer<BeanDefinition> hasBindMethodAttribute(BindMethod bindMethod) {
|
||||||
return (definition) -> {
|
return (definition) -> {
|
||||||
assertThat(definition.hasAttribute(BindMethod.class.getName())).isTrue();
|
assertThat(definition.hasAttribute(BindMethod.class.getName())).isTrue();
|
||||||
@@ -146,6 +157,12 @@ class ConfigurationPropertiesBeanRegistrarTests {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigurationProperties(prefix = "beancp")
|
||||||
|
@Primary
|
||||||
|
static class PrimaryConfigurationProperties {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static class NoAnnotationConfigurationProperties {
|
static class NoAnnotationConfigurationProperties {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user