Skip to content

Commit 753d8bb

Browse files
committed
DATACMNS-1497 - Configuration infrastructure now considers scanning BeanNameGenerator.
We now implement the newly introduced ImportBeanDefinitionRegistrar overload additional provided with a BeanNameGenerator configured for the import scanning. We forward this into our bean name generation infrastructure as fallback. Related tickets: spring-projects/spring-framework#22591
1 parent c4a51f1 commit 753d8bb

8 files changed

+102
-23
lines changed

src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java

+41-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929

3030
import org.springframework.beans.BeanUtils;
3131
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
32+
import org.springframework.beans.factory.support.BeanNameGenerator;
33+
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
34+
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
3235
import org.springframework.context.annotation.FilterType;
3336
import org.springframework.core.annotation.AnnotationAttributes;
3437
import org.springframework.core.env.Environment;
@@ -42,6 +45,7 @@
4245
import org.springframework.core.type.filter.TypeFilter;
4346
import org.springframework.data.config.ConfigurationUtils;
4447
import org.springframework.data.util.Streamable;
48+
import org.springframework.lang.Nullable;
4549
import org.springframework.util.Assert;
4650
import org.springframework.util.ClassUtils;
4751
import org.springframework.util.StringUtils;
@@ -82,11 +86,31 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura
8286
* @param resourceLoader must not be {@literal null}.
8387
* @param environment must not be {@literal null}.
8488
* @param registry must not be {@literal null}.
89+
* @deprecated since 2.2. Prefer to use overload taking a {@link BeanNameGenerator} additionally.
8590
*/
91+
@Deprecated
8692
public AnnotationRepositoryConfigurationSource(AnnotationMetadata metadata, Class<? extends Annotation> annotation,
8793
ResourceLoader resourceLoader, Environment environment, BeanDefinitionRegistry registry) {
94+
this(metadata, annotation, resourceLoader, environment, registry, null);
95+
}
96+
97+
/**
98+
* Creates a new {@link AnnotationRepositoryConfigurationSource} from the given {@link AnnotationMetadata} and
99+
* annotation.
100+
*
101+
* @param metadata must not be {@literal null}.
102+
* @param annotation must not be {@literal null}.
103+
* @param resourceLoader must not be {@literal null}.
104+
* @param environment must not be {@literal null}.
105+
* @param registry must not be {@literal null}.
106+
* @param generator can be {@literal null}.
107+
*/
108+
public AnnotationRepositoryConfigurationSource(AnnotationMetadata metadata, Class<? extends Annotation> annotation,
109+
ResourceLoader resourceLoader, Environment environment, BeanDefinitionRegistry registry,
110+
@Nullable BeanNameGenerator generator) {
88111

89-
super(environment, ConfigurationUtils.getRequiredClassLoader(resourceLoader), registry);
112+
super(environment, ConfigurationUtils.getRequiredClassLoader(resourceLoader), registry,
113+
defaultBeanNameGenerator(generator));
90114

91115
Assert.notNull(metadata, "Metadata must not be null!");
92116
Assert.notNull(annotation, "Annotation must not be null!");
@@ -397,4 +421,20 @@ private String[] getPatterns(AnnotationAttributes filterAttributes) {
397421
return new String[0];
398422
}
399423
}
424+
425+
/**
426+
* Returns the {@link BeanNameGenerator} to use falling back to an {@link AnnotationBeanNameGenerator} if either the
427+
* given generator is {@literal null} or it's the one locally declared in {@link ConfigurationClassPostProcessor}'s
428+
* {@code importBeanNameGenerator}. This is to make sure we only use the given {@link BeanNameGenerator} if it was
429+
* customized.
430+
*
431+
* @param generator can be {@literal null}.
432+
* @return
433+
*/
434+
private static BeanNameGenerator defaultBeanNameGenerator(@Nullable BeanNameGenerator generator) {
435+
436+
return generator == null || ConfigurationClassPostProcessor.IMPORT_BEAN_NAME_GENERATOR.equals(generator) //
437+
? new AnnotationBeanNameGenerator() //
438+
: generator;
439+
}
400440
}

src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupport.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.springframework.beans.factory.config.BeanDefinition;
2323
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
24+
import org.springframework.beans.factory.support.BeanNameGenerator;
2425
import org.springframework.context.EnvironmentAware;
2526
import org.springframework.context.ResourceLoaderAware;
2627
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
@@ -60,9 +61,11 @@ public void setEnvironment(Environment environment) {
6061

6162
/*
6263
* (non-Javadoc)
63-
* @see org.springframework.context.annotation.ImportBeanDefinitionRegistrar#registerBeanDefinitions(org.springframework.core.type.AnnotationMetadata, org.springframework.beans.factory.support.BeanDefinitionRegistry)
64+
* @see org.springframework.context.annotation.ImportBeanDefinitionRegistrar#registerBeanDefinitions(org.springframework.core.type.AnnotationMetadata, org.springframework.beans.factory.support.BeanDefinitionRegistry, org.springframework.beans.factory.support.BeanNameGenerator)
6465
*/
65-
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
66+
@Override
67+
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry,
68+
BeanNameGenerator generator) {
6669

6770
Assert.notNull(annotationMetadata, "AnnotationMetadata must not be null!");
6871
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
@@ -74,7 +77,7 @@ public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanD
7477
}
7578

7679
AnnotationRepositoryConfigurationSource configurationSource = new AnnotationRepositoryConfigurationSource(
77-
annotationMetadata, getAnnotation(), resourceLoader, environment, registry);
80+
annotationMetadata, getAnnotation(), resourceLoader, environment, registry, generator);
7881

7982
RepositoryConfigurationExtension extension = getExtension();
8083
RepositoryConfigurationUtils.exposeRegistration(extension, registry, configurationSource);

src/main/java/org/springframework/data/repository/config/RepositoryBeanNameGenerator.java

+19-7
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@
1515
*/
1616
package org.springframework.data.repository.config;
1717

18-
import lombok.RequiredArgsConstructor;
19-
2018
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
2119
import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
2220
import org.springframework.beans.factory.config.BeanDefinition;
2321
import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder;
2422
import org.springframework.beans.factory.support.BeanNameGenerator;
2523
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
24+
import org.springframework.util.Assert;
2625
import org.springframework.util.ClassUtils;
2726

2827
/**
@@ -33,12 +32,25 @@
3332
* @author Oliver Gierke
3433
* @author Jens Schauder
3534
*/
36-
@RequiredArgsConstructor
37-
public class RepositoryBeanNameGenerator {
38-
39-
private static final SpringDataAnnotationBeanNameGenerator DELEGATE = new SpringDataAnnotationBeanNameGenerator();
35+
class RepositoryBeanNameGenerator {
4036

4137
private final ClassLoader beanClassLoader;
38+
private final SpringDataAnnotationBeanNameGenerator delegate;
39+
40+
/**
41+
* Creates a new {@link RepositoryBeanNameGenerator} for the given {@link ClassLoader} and {@link BeanNameGenerator}.
42+
*
43+
* @param beanClassLoader must not be {@literal null}.
44+
* @param generator must not be {@literal null}.
45+
*/
46+
public RepositoryBeanNameGenerator(ClassLoader beanClassLoader, BeanNameGenerator generator) {
47+
48+
Assert.notNull(beanClassLoader, "Bean ClassLoader must not be null!");
49+
Assert.notNull(generator, "BeanNameGenerator must not be null!");
50+
51+
this.beanClassLoader = beanClassLoader;
52+
this.delegate = new SpringDataAnnotationBeanNameGenerator(generator);
53+
}
4254

4355
/**
4456
* Generate a bean name for the given bean definition.
@@ -53,7 +65,7 @@ public String generateBeanName(BeanDefinition definition) {
5365
? (AnnotatedBeanDefinition) definition //
5466
: new AnnotatedGenericBeanDefinition(getRepositoryInterfaceFrom(definition));
5567

56-
return DELEGATE.generateBeanName(beanDefinition);
68+
return delegate.generateBeanName(beanDefinition);
5769
}
5870

5971
/**

src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSourceSupport.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import org.springframework.beans.factory.config.BeanDefinition;
2424
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
25+
import org.springframework.beans.factory.support.BeanNameGenerator;
2526
import org.springframework.core.env.Environment;
2627
import org.springframework.core.io.ResourceLoader;
2728
import org.springframework.core.type.classreading.MetadataReaderFactory;
@@ -53,14 +54,14 @@ public abstract class RepositoryConfigurationSourceSupport implements Repository
5354
* @param registry must not be {@literal null}.
5455
*/
5556
public RepositoryConfigurationSourceSupport(Environment environment, ClassLoader classLoader,
56-
BeanDefinitionRegistry registry) {
57+
BeanDefinitionRegistry registry, BeanNameGenerator generator) {
5758

5859
Assert.notNull(environment, "Environment must not be null!");
5960
Assert.notNull(classLoader, "ClassLoader must not be null!");
6061
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
6162

6263
this.environment = environment;
63-
this.beanNameGenerator = new RepositoryBeanNameGenerator(classLoader);
64+
this.beanNameGenerator = new RepositoryBeanNameGenerator(classLoader, generator);
6465
this.registry = registry;
6566
}
6667

src/main/java/org/springframework/data/repository/config/SpringDataAnnotationBeanNameGenerator.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@
1515
*/
1616
package org.springframework.data.repository.config;
1717

18+
import lombok.NonNull;
19+
import lombok.RequiredArgsConstructor;
20+
1821
import org.springframework.beans.factory.config.BeanDefinition;
1922
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
23+
import org.springframework.beans.factory.support.BeanNameGenerator;
2024
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
2125

2226
/**
@@ -29,9 +33,10 @@
2933
* @since 2.0
3034
* @soundtrack Nils Wülker - Never Left At All (feat. Rob Summerfield)
3135
*/
32-
public class SpringDataAnnotationBeanNameGenerator {
36+
@RequiredArgsConstructor
37+
class SpringDataAnnotationBeanNameGenerator {
3338

34-
private final AnnotationBeanNameGenerator delegate = new AnnotationBeanNameGenerator();
39+
private final @NonNull BeanNameGenerator delegate;
3540

3641
/**
3742
* Generates a bean name for the given {@link BeanDefinition}.

src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ public class XmlRepositoryConfigurationSource extends RepositoryConfigurationSou
6868
*/
6969
public XmlRepositoryConfigurationSource(Element element, ParserContext context, Environment environment) {
7070

71-
super(environment, ConfigurationUtils.getRequiredClassLoader(context.getReaderContext()), context.getRegistry());
71+
super(environment, ConfigurationUtils.getRequiredClassLoader(context.getReaderContext()), context.getRegistry(),
72+
context.getReaderContext().getReader().getBeanNameGenerator());
7273

7374
Assert.notNull(element, "Element must not be null!");
7475

src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java

+21-6
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.mockito.junit.MockitoJUnitRunner;
2828
import org.springframework.beans.factory.config.BeanDefinition;
2929
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
30+
import org.springframework.beans.factory.support.BeanNameGenerator;
31+
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
3032
import org.springframework.context.annotation.ComponentScan.Filter;
3133
import org.springframework.context.annotation.FilterType;
3234
import org.springframework.core.env.StandardEnvironment;
@@ -64,7 +66,7 @@ public void registersBeanDefinitionForFoundBean() {
6466

6567
AnnotationMetadata metadata = new StandardAnnotationMetadata(SampleConfiguration.class, true);
6668

67-
registrar.registerBeanDefinitions(metadata, registry);
69+
registrar.registerBeanDefinitions(metadata, registry, null);
6870

6971
assertBeanDefinitionRegisteredFor("myRepository");
7072
assertBeanDefinitionRegisteredFor("composedRepository");
@@ -78,7 +80,7 @@ public void registersBeanDefinitionWithoutFragmentImplementations() {
7880

7981
AnnotationMetadata metadata = new StandardAnnotationMetadata(FragmentExclusionConfiguration.class, true);
8082

81-
registrar.registerBeanDefinitions(metadata, registry);
83+
registrar.registerBeanDefinitions(metadata, registry, null);
8284

8385
assertBeanDefinitionRegisteredFor("repositoryWithFragmentExclusion");
8486
assertNoBeanDefinitionRegisteredFor("excludedRepositoryImpl");
@@ -89,7 +91,7 @@ public void shouldLimitImplementationBasePackages() {
8991

9092
AnnotationMetadata metadata = new StandardAnnotationMetadata(LimitsImplementationBasePackages.class, true);
9193

92-
registrar.registerBeanDefinitions(metadata, registry);
94+
registrar.registerBeanDefinitions(metadata, registry, null);
9395

9496
assertBeanDefinitionRegisteredFor("personRepository");
9597
assertNoBeanDefinitionRegisteredFor("fragmentImpl");
@@ -98,17 +100,30 @@ public void shouldLimitImplementationBasePackages() {
98100
@Test // DATACMNS-360
99101
public void registeredProfileRepositoriesIfProfileActivated() {
100102

101-
StandardAnnotationMetadata metadata = new StandardAnnotationMetadata(SampleConfiguration.class, true);
103+
AnnotationMetadata metadata = new StandardAnnotationMetadata(SampleConfiguration.class, true);
102104
environment.setActiveProfiles("profile");
103105

104106
DummyRegistrar registrar = new DummyRegistrar();
105107
registrar.setEnvironment(environment);
106-
107-
registrar.registerBeanDefinitions(metadata, registry);
108+
registrar.registerBeanDefinitions(metadata, registry, null);
108109

109110
assertBeanDefinitionRegisteredFor("myRepository", "profileRepository");
110111
}
111112

113+
@Test // DATACMNS-1497
114+
public void usesBeanNameGeneratorProvided() {
115+
116+
AnnotationMetadata metadata = new StandardAnnotationMetadata(SampleConfiguration.class, true);
117+
BeanNameGenerator delegate = new AnnotationBeanNameGenerator();
118+
119+
DummyRegistrar registrar = new DummyRegistrar();
120+
registrar.setEnvironment(environment);
121+
registrar.registerBeanDefinitions(metadata, registry,
122+
(definition, registry) -> delegate.generateBeanName(definition, registry).concat("Hello"));
123+
124+
assertBeanDefinitionRegisteredFor("myRepositoryHello");
125+
}
126+
112127
private void assertBeanDefinitionRegisteredFor(String... names) {
113128

114129
for (String name : names) {

src/test/java/org/springframework/data/repository/config/RepositoryBeanNameGeneratorUnitTests.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.beans.factory.config.BeanDefinition;
2828
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
2929
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
30+
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
3031
import org.springframework.context.annotation.ScannedGenericBeanDefinition;
3132
import org.springframework.core.type.classreading.MetadataReader;
3233
import org.springframework.core.type.classreading.MetadataReaderFactory;
@@ -48,7 +49,8 @@ public class RepositoryBeanNameGeneratorUnitTests {
4849

4950
@Before
5051
public void setUp() {
51-
this.generator = new RepositoryBeanNameGenerator(Thread.currentThread().getContextClassLoader());
52+
this.generator = new RepositoryBeanNameGenerator(Thread.currentThread().getContextClassLoader(),
53+
new AnnotationBeanNameGenerator());
5254
}
5355

5456
@Test

0 commit comments

Comments
 (0)