Skip to content

Commit feae0df

Browse files
Add support for using custom BeanNameGenerator.
Closes: #586
1 parent c514d55 commit feae0df

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed

src/main/java/org/springframework/data/map/repository/config/EnableMapRepositories.java

+8
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.concurrent.ConcurrentHashMap;
2626

2727
import org.springframework.beans.factory.FactoryBean;
28+
import org.springframework.beans.factory.support.BeanNameGenerator;
2829
import org.springframework.context.ApplicationContext;
2930
import org.springframework.context.annotation.ComponentScan.Filter;
3031
import org.springframework.context.annotation.Import;
@@ -126,6 +127,13 @@
126127
*/
127128
Class<?> repositoryBaseClass() default DefaultRepositoryBaseClass.class;
128129

130+
/**
131+
* Configure a specific {@link BeanNameGenerator} to be used when creating the repository beans.
132+
* @return the {@link BeanNameGenerator} to be used or the base {@link BeanNameGenerator} interface to indicate context default.
133+
* @since 3.4
134+
*/
135+
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
136+
129137
/**
130138
* Configures the name of the {@link KeyValueOperations} bean to be used with the repositories detected.
131139
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*
2+
* Copyright 2024 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.data.keyvalue.repository;
17+
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
20+
import java.util.Arrays;
21+
import java.util.stream.Stream;
22+
23+
import org.junit.jupiter.api.BeforeEach;
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;
28+
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
29+
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
30+
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
31+
import org.springframework.core.env.StandardEnvironment;
32+
import org.springframework.core.io.DefaultResourceLoader;
33+
import org.springframework.core.type.AnnotationMetadata;
34+
import org.springframework.data.map.repository.config.EnableMapRepositories;
35+
import org.springframework.data.map.repository.config.MapRepositoriesRegistrar;
36+
import org.springframework.data.repository.CrudRepository;
37+
38+
/**
39+
* @author Christoph Strobl
40+
*/
41+
class MapRepositoriesRegistrarUnitTests {
42+
43+
private BeanDefinitionRegistry registry;
44+
45+
@BeforeEach
46+
void setUp() {
47+
registry = new DefaultListableBeanFactory();
48+
}
49+
50+
@ParameterizedTest // GH-499, GH-3440
51+
@MethodSource(value = { "args" })
52+
void configuresRepositoriesCorrectly(AnnotationMetadata metadata, String[] beanNames) {
53+
54+
MapRepositoriesRegistrar registrar = new MapRepositoriesRegistrar();
55+
registrar.setResourceLoader(new DefaultResourceLoader());
56+
registrar.setEnvironment(new StandardEnvironment());
57+
registrar.registerBeanDefinitions(metadata, registry);
58+
59+
Iterable<String> names = Arrays.asList(registry.getBeanDefinitionNames());
60+
assertThat(names).contains(beanNames);
61+
}
62+
63+
static Stream<Arguments> args() {
64+
return Stream.of(
65+
Arguments.of(AnnotationMetadata.introspect(Config.class),
66+
new String[] { "mapRepositoriesRegistrarUnitTests.PersonRepository" }),
67+
Arguments.of(AnnotationMetadata.introspect(ConfigWithBeanNameGenerator.class),
68+
new String[] { "mapRepositoriesRegistrarUnitTests.PersonREPO" }));
69+
}
70+
71+
@EnableMapRepositories(basePackageClasses = PersonRepository.class, considerNestedRepositories = true)
72+
private class Config {
73+
74+
}
75+
76+
@EnableMapRepositories(basePackageClasses = PersonRepository.class, nameGenerator = MyBeanNameGenerator.class,
77+
considerNestedRepositories = true)
78+
private class ConfigWithBeanNameGenerator {
79+
80+
}
81+
82+
static class MyBeanNameGenerator extends AnnotationBeanNameGenerator {
83+
84+
@Override
85+
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
86+
return super.generateBeanName(definition, registry).replaceAll("Repository", "REPO");
87+
}
88+
}
89+
90+
interface PersonRepository extends CrudRepository<Person, String> {
91+
92+
}
93+
94+
static class Person {}
95+
}

0 commit comments

Comments
 (0)