From a5681f637cf09b4d2f7a73443a199b86d5437edd Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Wed, 3 Apr 2019 11:53:58 +0200 Subject: [PATCH] DATACMNS-1497 - Polishing. RepositoryBeanDefinitionRegistrarSupport now also overrides registerBeanDefinitions(AnnotationMetadata, BeanDefinitionRegistry) so that unit test in downstream modules still work. Added defaulting of BeanNameGenerator in XmlRepositoryConfigurationSource so that we use an AnnotationBeanNameGenerator if a DefaultBeanNameGenerator is handed in. Related tickets: spring-projects/spring-framework#22591 --- ...ositoryBeanDefinitionRegistrarSupport.java | 29 +++++++++++++++---- .../XmlRepositoryConfigurationSource.java | 21 +++++++++++++- ...anDefinitionRegistrarSupportUnitTests.java | 8 ++--- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupport.java b/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupport.java index d4efc50a3..7554da8da 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupport.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupport.java @@ -24,6 +24,7 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.context.EnvironmentAware; import org.springframework.context.ResourceLoaderAware; +import org.springframework.context.annotation.ConfigurationClassPostProcessor; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.env.Environment; import org.springframework.core.io.ResourceLoader; @@ -59,25 +60,43 @@ public abstract class RepositoryBeanDefinitionRegistrarSupport this.environment = environment; } + /** + * Forwarding to {@link #registerBeanDefinitions(AnnotationMetadata, BeanDefinitionRegistry, BeanNameGenerator)} for + * backwards compatibility reasons so that tests in downstream modules do not accidentally invoke the super type's + * default implementation. + * + * @see org.springframework.context.annotation.ImportBeanDefinitionRegistrar#registerBeanDefinitions(org.springframework.core.type.AnnotationMetadata, + * org.springframework.beans.factory.support.BeanDefinitionRegistry) + * @deprecated since 2.2, call + * {@link #registerBeanDefinitions(AnnotationMetadata, BeanDefinitionRegistry, BeanNameGenerator)} + * instead. + * @see ConfigurationClassPostProcessor#IMPORT_BEAN_NAME_GENERATOR + */ + @Override + @Deprecated + public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { + registerBeanDefinitions(metadata, registry, ConfigurationClassPostProcessor.IMPORT_BEAN_NAME_GENERATOR); + } + /* * (non-Javadoc) * @see org.springframework.context.annotation.ImportBeanDefinitionRegistrar#registerBeanDefinitions(org.springframework.core.type.AnnotationMetadata, org.springframework.beans.factory.support.BeanDefinitionRegistry, org.springframework.beans.factory.support.BeanNameGenerator) */ @Override - public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry, + public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry, BeanNameGenerator generator) { - Assert.notNull(annotationMetadata, "AnnotationMetadata must not be null!"); + Assert.notNull(metadata, "AnnotationMetadata must not be null!"); Assert.notNull(registry, "BeanDefinitionRegistry must not be null!"); Assert.notNull(resourceLoader, "ResourceLoader must not be null!"); // Guard against calls for sub-classes - if (annotationMetadata.getAnnotationAttributes(getAnnotation().getName()) == null) { + if (metadata.getAnnotationAttributes(getAnnotation().getName()) == null) { return; } - AnnotationRepositoryConfigurationSource configurationSource = new AnnotationRepositoryConfigurationSource( - annotationMetadata, getAnnotation(), resourceLoader, environment, registry, generator); + AnnotationRepositoryConfigurationSource configurationSource = new AnnotationRepositoryConfigurationSource(metadata, + getAnnotation(), resourceLoader, environment, registry, generator); RepositoryConfigurationExtension extension = getExtension(); RepositoryConfigurationUtils.exposeRegistration(extension, registry, configurationSource); diff --git a/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java b/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java index bb9562422..7266cc28e 100644 --- a/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java @@ -19,7 +19,10 @@ import java.util.Collection; import java.util.Locale; import java.util.Optional; +import org.springframework.beans.factory.support.BeanNameGenerator; +import org.springframework.beans.factory.support.DefaultBeanNameGenerator; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.context.annotation.AnnotationBeanNameGenerator; import org.springframework.core.env.Environment; import org.springframework.core.type.filter.TypeFilter; import org.springframework.data.config.ConfigurationUtils; @@ -69,7 +72,7 @@ public class XmlRepositoryConfigurationSource extends RepositoryConfigurationSou public XmlRepositoryConfigurationSource(Element element, ParserContext context, Environment environment) { super(environment, ConfigurationUtils.getRequiredClassLoader(context.getReaderContext()), context.getRegistry(), - context.getReaderContext().getReader().getBeanNameGenerator()); + defaultBeanNameGenerator(context.getReaderContext().getReader().getBeanNameGenerator())); Assert.notNull(element, "Element must not be null!"); @@ -240,4 +243,20 @@ public class XmlRepositoryConfigurationSource extends RepositoryConfigurationSou ? BootstrapMode.valueOf(attribute.toUpperCase(Locale.US)) // : BootstrapMode.DEFAULT; } + + /** + * Returns the {@link BeanNameGenerator} to use falling back to an {@link AnnotationBeanNameGenerator} if either the + * given generator is {@literal null} or it's {@link DefaultBeanNameGenerator} in particular. This is to make sure we + * only use the given {@link BeanNameGenerator} if it was customized. + * + * @param generator can be {@literal null}. + * @return + * @since 2.2 + */ + private static BeanNameGenerator defaultBeanNameGenerator(@Nullable BeanNameGenerator generator) { + + return generator == null || DefaultBeanNameGenerator.class.equals(generator.getClass()) // + ? new AnnotationBeanNameGenerator() // + : generator; + } } diff --git a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java index d6d98a8f8..51690a4f0 100755 --- a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java @@ -66,7 +66,7 @@ public class RepositoryBeanDefinitionRegistrarSupportUnitTests { AnnotationMetadata metadata = new StandardAnnotationMetadata(SampleConfiguration.class, true); - registrar.registerBeanDefinitions(metadata, registry, null); + registrar.registerBeanDefinitions(metadata, registry); assertBeanDefinitionRegisteredFor("myRepository"); assertBeanDefinitionRegisteredFor("composedRepository"); @@ -80,7 +80,7 @@ public class RepositoryBeanDefinitionRegistrarSupportUnitTests { AnnotationMetadata metadata = new StandardAnnotationMetadata(FragmentExclusionConfiguration.class, true); - registrar.registerBeanDefinitions(metadata, registry, null); + registrar.registerBeanDefinitions(metadata, registry); assertBeanDefinitionRegisteredFor("repositoryWithFragmentExclusion"); assertNoBeanDefinitionRegisteredFor("excludedRepositoryImpl"); @@ -91,7 +91,7 @@ public class RepositoryBeanDefinitionRegistrarSupportUnitTests { AnnotationMetadata metadata = new StandardAnnotationMetadata(LimitsImplementationBasePackages.class, true); - registrar.registerBeanDefinitions(metadata, registry, null); + registrar.registerBeanDefinitions(metadata, registry); assertBeanDefinitionRegisteredFor("personRepository"); assertNoBeanDefinitionRegisteredFor("fragmentImpl"); @@ -105,7 +105,7 @@ public class RepositoryBeanDefinitionRegistrarSupportUnitTests { DummyRegistrar registrar = new DummyRegistrar(); registrar.setEnvironment(environment); - registrar.registerBeanDefinitions(metadata, registry, null); + registrar.registerBeanDefinitions(metadata, registry); assertBeanDefinitionRegisteredFor("myRepository", "profileRepository"); }