Skip to content

Commit 9ca3acf

Browse files
committed
Fix Add Multiple DeferredRepositoryInitializationListener in RepositoryConfigurationDelegate
1 parent 3f543c2 commit 9ca3acf

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

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

+9-7
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public class RepositoryConfigurationDelegate {
9292
* @param environment must not be {@literal null}.
9393
*/
9494
public RepositoryConfigurationDelegate(RepositoryConfigurationSource configurationSource,
95-
ResourceLoader resourceLoader, Environment environment) {
95+
ResourceLoader resourceLoader, Environment environment) {
9696

9797
this.isXml = configurationSource instanceof XmlRepositoryConfigurationSource;
9898
boolean isAnnotation = configurationSource instanceof AnnotationRepositoryConfigurationSource;
@@ -117,7 +117,7 @@ public RepositoryConfigurationDelegate(RepositoryConfigurationSource configurati
117117
* {@link Environment}.
118118
*/
119119
private static Environment defaultEnvironment(@Nullable Environment environment,
120-
@Nullable ResourceLoader resourceLoader) {
120+
@Nullable ResourceLoader resourceLoader) {
121121

122122
if (environment != null) {
123123
return environment;
@@ -136,7 +136,7 @@ private static Environment defaultEnvironment(@Nullable Environment environment,
136136
* @see org.springframework.beans.factory.support.BeanDefinitionRegistry
137137
*/
138138
public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegistry registry,
139-
RepositoryConfigurationExtension extension) {
139+
RepositoryConfigurationExtension extension) {
140140

141141
if (logger.isInfoEnabled()) {
142142
logger.info(LogMessage.format("Bootstrapping Spring Data %s repositories in %s mode.", //
@@ -222,7 +222,7 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
222222
}
223223

224224
private void registerAotComponents(BeanDefinitionRegistry registry, RepositoryConfigurationExtension extension,
225-
Map<String, RepositoryConfigurationAdapter<?>> metadataByRepositoryBeanName) {
225+
Map<String, RepositoryConfigurationAdapter<?>> metadataByRepositoryBeanName) {
226226

227227
BeanDefinitionBuilder repositoryAotProcessor = BeanDefinitionBuilder
228228
.rootBeanDefinition(extension.getRepositoryAotProcessor()).setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
@@ -245,7 +245,7 @@ private void registerAotComponents(BeanDefinitionRegistry registry, RepositoryCo
245245
* @param registry must not be {@literal null}.
246246
*/
247247
private static void potentiallyLazifyRepositories(Map<String, RepositoryConfiguration<?>> configurations,
248-
BeanDefinitionRegistry registry, BootstrapMode mode) {
248+
BeanDefinitionRegistry registry, BootstrapMode mode) {
249249

250250
if (!DefaultListableBeanFactory.class.isInstance(registry) || BootstrapMode.DEFAULT.equals(mode)) {
251251
return;
@@ -272,8 +272,10 @@ private static void potentiallyLazifyRepositories(Map<String, RepositoryConfigur
272272

273273
logger.debug("Registering deferred repository initialization listener.");
274274

275-
beanFactory.registerSingleton(DeferredRepositoryInitializationListener.class.getName(),
276-
new DeferredRepositoryInitializationListener(beanFactory));
275+
if (!beanFactory.containsBean(DeferredRepositoryInitializationListener.class.getName())) {
276+
beanFactory.registerSingleton(DeferredRepositoryInitializationListener.class.getName(),
277+
new DeferredRepositoryInitializationListener(beanFactory));
278+
}
277279
}
278280
}
279281

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

+18-2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
*
6565
* @author Oliver Gierke
6666
* @author Mark Paluch
67+
* @author xeounxzxu
6768
* @soundtrack Richard Spaven - Tribute (Whole Other*)
6869
*/
6970
@ExtendWith(MockitoExtension.class)
@@ -109,7 +110,16 @@ void registersDeferredRepositoryInitializationListener() {
109110
var beanFactory = assertLazyRepositoryBeanSetup(DeferredConfig.class);
110111

111112
assertThat(beanFactory.getBeanNamesForType(DeferredRepositoryInitializationListener.class)).isNotEmpty();
113+
}
114+
115+
@Test
116+
void registersMultiDeferredRepositoryInitializationListener() {
112117

118+
var beanFactory = assertLazyRepositoryBeanSetup(DeferredConfig.class, OtherDeferredConfig.class);
119+
120+
assertThat(beanFactory.getBeanNamesForType(DeferredRepositoryInitializationListener.class)).isNotEmpty();
121+
assertThat(beanFactory.getBeanNamesForType(AddressRepository.class)).isNotEmpty();
122+
assertThat(beanFactory.getBeanNamesForType(ProductRepository.class)).isNotEmpty();
113123
}
114124

115125
@Test // DATACMNS-1832
@@ -276,9 +286,9 @@ void considersGenericLength() {
276286
assertThat(it.getGeneric(1).resolve()).isEqualTo(Person.class);
277287
}
278288

279-
private static ListableBeanFactory assertLazyRepositoryBeanSetup(Class<?> configClass) {
289+
private static ListableBeanFactory assertLazyRepositoryBeanSetup(Class<?>... componentClasses) {
280290

281-
var context = new AnnotationConfigApplicationContext(configClass);
291+
var context = new AnnotationConfigApplicationContext(componentClasses);
282292

283293
assertThat(context.getDefaultListableBeanFactory().getAutowireCandidateResolver())
284294
.isInstanceOf(LazyRepositoryInjectionPointResolver.class);
@@ -309,6 +319,12 @@ static class LazyConfig {}
309319
bootstrapMode = BootstrapMode.DEFERRED)
310320
static class DeferredConfig {}
311321

322+
@ComponentScan(basePackageClasses = ProductRepository.class)
323+
@EnableRepositories(basePackageClasses = ProductRepository.class,
324+
includeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = AddressRepository.class),
325+
bootstrapMode = BootstrapMode.DEFERRED)
326+
static class OtherDeferredConfig {}
327+
312328
@EnableRepositories(basePackageClasses = MyOtherRepository.class,
313329
includeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyOtherRepository.class),
314330
excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyOtherRepositoryImpl.class))

0 commit comments

Comments
 (0)