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
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user