Avoid duplicate retrieval of @ConfigurationProperties in registrar

Closes gh-15802
This commit is contained in:
Andy Wilkinson 2019-05-28 08:54:53 +01:00
parent f2b4374c57
commit d21a091262
1 changed files with 13 additions and 17 deletions

View File

@ -27,7 +27,7 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.core.KotlinDetector; import org.springframework.core.KotlinDetector;
import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations; import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.core.annotation.MergedAnnotations.SearchStrategy; import org.springframework.core.annotation.MergedAnnotations.SearchStrategy;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -48,16 +48,17 @@ final class ConfigurationPropertiesBeanDefinitionRegistrar {
public static void register(BeanDefinitionRegistry registry, public static void register(BeanDefinitionRegistry registry,
ConfigurableListableBeanFactory beanFactory, Class<?> type) { ConfigurableListableBeanFactory beanFactory, Class<?> type) {
String name = getName(type); MergedAnnotation<ConfigurationProperties> annotation = MergedAnnotations
.from(type, SearchStrategy.EXHAUSTIVE).get(ConfigurationProperties.class);
String name = getName(type, annotation);
if (!containsBeanDefinition(beanFactory, name)) { if (!containsBeanDefinition(beanFactory, name)) {
registerBeanDefinition(registry, beanFactory, name, type); registerBeanDefinition(registry, beanFactory, name, type, annotation);
} }
} }
private static String getName(Class<?> type) { private static String getName(Class<?> type,
ConfigurationProperties annotation = AnnotationUtils.findAnnotation(type, MergedAnnotation<ConfigurationProperties> annotation) {
ConfigurationProperties.class); String prefix = annotation.isPresent() ? annotation.getString("prefix") : "";
String prefix = (annotation != null) ? annotation.prefix() : "";
return (StringUtils.hasText(prefix) ? prefix + "-" + type.getName() return (StringUtils.hasText(prefix) ? prefix + "-" + type.getName()
: type.getName()); : type.getName());
} }
@ -75,18 +76,13 @@ final class ConfigurationPropertiesBeanDefinitionRegistrar {
} }
private static void registerBeanDefinition(BeanDefinitionRegistry registry, private static void registerBeanDefinition(BeanDefinitionRegistry registry,
ConfigurableListableBeanFactory beanFactory, String name, Class<?> type) { ConfigurableListableBeanFactory beanFactory, String name, Class<?> type,
assertHasAnnotation(type); MergedAnnotation<ConfigurationProperties> annotation) {
registry.registerBeanDefinition(name, Assert.isTrue(annotation.isPresent(),
createBeanDefinition(beanFactory, name, type));
}
private static void assertHasAnnotation(Class<?> type) {
Assert.isTrue(
MergedAnnotations.from(type, SearchStrategy.EXHAUSTIVE)
.isPresent(ConfigurationProperties.class),
() -> "No " + ConfigurationProperties.class.getSimpleName() () -> "No " + ConfigurationProperties.class.getSimpleName()
+ " annotation found on '" + type.getName() + "'."); + " annotation found on '" + type.getName() + "'.");
registry.registerBeanDefinition(name,
createBeanDefinition(beanFactory, name, type));
} }
private static BeanDefinition createBeanDefinition( private static BeanDefinition createBeanDefinition(