Skip to content

Commit e3da2f7

Browse files
Add support for using custom BeanNameGenerator.
Closes: #3440
1 parent 9e54c37 commit e3da2f7

File tree

3 files changed

+51
-7
lines changed

3 files changed

+51
-7
lines changed

spring-data-envers/src/main/java/org/springframework/data/envers/repository/config/EnableEnversRepositories.java

+10
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.lang.annotation.Target;
2525

2626
import org.springframework.beans.factory.FactoryBean;
27+
import org.springframework.beans.factory.support.BeanNameGenerator;
2728
import org.springframework.context.annotation.ComponentScan.Filter;
2829
import org.springframework.context.annotation.Lazy;
2930
import org.springframework.core.annotation.AliasFor;
@@ -136,6 +137,15 @@
136137
@AliasFor(annotation = EnableJpaRepositories.class)
137138
Class<?> repositoryBaseClass() default DefaultRepositoryBaseClass.class;
138139

140+
/**
141+
* Configure a specific {@link BeanNameGenerator} to be used when creating the repositoy beans.
142+
* @return the {@link BeanNameGenerator} to be used or the base {@link BeanNameGenerator} interface to indicate context default.
143+
* @since 3.4
144+
* @see EnableJpaRepositories#nameGenerator()
145+
*/
146+
@AliasFor(annotation = EnableJpaRepositories.class)
147+
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
148+
139149
// JPA specific configuration
140150

141151
/**

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/config/EnableJpaRepositories.java

+8
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.lang.annotation.Target;
2525

2626
import org.springframework.beans.factory.FactoryBean;
27+
import org.springframework.beans.factory.support.BeanNameGenerator;
2728
import org.springframework.context.annotation.ComponentScan.Filter;
2829
import org.springframework.context.annotation.Import;
2930
import org.springframework.context.annotation.Lazy;
@@ -119,6 +120,13 @@
119120
*/
120121
Class<?> repositoryBaseClass() default DefaultRepositoryBaseClass.class;
121122

123+
/**
124+
* Configure a specific {@link BeanNameGenerator} to be used when creating the repository beans.
125+
* @return the {@link BeanNameGenerator} to be used or the base {@link BeanNameGenerator} interface to indicate context default.
126+
* @since 3.4
127+
*/
128+
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
129+
122130
// JPA specific configuration
123131

124132
/**

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/config/JpaRepositoriesRegistrarUnitTests.java

+33-7
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,16 @@
1818
import static org.assertj.core.api.Assertions.assertThat;
1919

2020
import java.util.Arrays;
21+
import java.util.stream.Stream;
2122

2223
import org.junit.jupiter.api.BeforeEach;
23-
import org.junit.jupiter.api.Test;
24+
import org.junit.jupiter.params.ParameterizedTest;
25+
import org.junit.jupiter.params.provider.Arguments;
26+
import org.junit.jupiter.params.provider.MethodSource;
27+
import org.springframework.beans.factory.config.BeanDefinition;
2428
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2529
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
30+
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
2631
import org.springframework.core.env.StandardEnvironment;
2732
import org.springframework.core.io.DefaultResourceLoader;
2833
import org.springframework.core.type.AnnotationMetadata;
@@ -34,33 +39,54 @@
3439
* @author Oliver Gierke
3540
* @author Jens Schauder
3641
* @author Erik Pellizzon
42+
* @author Christoph Strobl
3743
*/
3844
class JpaRepositoriesRegistrarUnitTests {
3945

4046
private BeanDefinitionRegistry registry;
41-
private AnnotationMetadata metadata;
4247

4348
@BeforeEach
4449
void setUp() {
45-
46-
metadata = AnnotationMetadata.introspect(Config.class);
4750
registry = new DefaultListableBeanFactory();
4851
}
4952

50-
@Test
51-
void configuresRepositoriesCorrectly() {
53+
54+
@ParameterizedTest // GH-499, GH-3440
55+
@MethodSource(value = { "args" })
56+
void configuresRepositoriesCorrectly(AnnotationMetadata metadata, String[] beanNames) {
5257

5358
JpaRepositoriesRegistrar registrar = new JpaRepositoriesRegistrar();
5459
registrar.setResourceLoader(new DefaultResourceLoader());
5560
registrar.setEnvironment(new StandardEnvironment());
5661
registrar.registerBeanDefinitions(metadata, registry);
5762

5863
Iterable<String> names = Arrays.asList(registry.getBeanDefinitionNames());
59-
assertThat(names).contains("userRepository", "auditableUserRepository", "roleRepository");
64+
assertThat(names).contains(beanNames);
65+
}
66+
67+
static Stream<Arguments> args() {
68+
return Stream.of(
69+
Arguments.of(AnnotationMetadata.introspect(Config.class),
70+
new String[] { "userRepository", "auditableUserRepository", "roleRepository" }),
71+
Arguments.of(AnnotationMetadata.introspect(ConfigWithBeanNameGenerator.class),
72+
new String[] { "userREPO", "auditableUserREPO", "roleREPO" }));
6073
}
6174

6275
@EnableJpaRepositories(basePackageClasses = UserRepository.class)
6376
private class Config {
6477

6578
}
79+
80+
@EnableJpaRepositories(basePackageClasses = UserRepository.class, nameGenerator = MyBeanNameGenerator.class)
81+
private class ConfigWithBeanNameGenerator {
82+
83+
}
84+
85+
static class MyBeanNameGenerator extends AnnotationBeanNameGenerator {
86+
87+
@Override
88+
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
89+
return super.generateBeanName(definition, registry).replaceAll("Repository", "REPO");
90+
}
91+
}
6692
}

0 commit comments

Comments
 (0)