Skip to content

Commit 14a0b21

Browse files
xeounxzxump911de
authored andcommitted
Avoid multiple DeferredRepositoryInitializationListener registrations in RepositoryConfigurationDelegate.
Closes #3287 Original pull request: #3219
1 parent 9e50394 commit 14a0b21

File tree

2 files changed

+22
-29
lines changed

2 files changed

+22
-29
lines changed

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

+15-22
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,6 @@
1515
*/
1616
package org.springframework.data.repository.config;
1717

18-
import java.lang.reflect.TypeVariable;
19-
import java.util.ArrayList;
20-
import java.util.Arrays;
21-
import java.util.Collection;
22-
import java.util.HashMap;
23-
import java.util.List;
24-
import java.util.Map;
25-
import java.util.stream.Collectors;
26-
2718
import org.apache.commons.logging.Log;
2819
import org.apache.commons.logging.LogFactory;
2920
import org.jspecify.annotations.Nullable;
@@ -32,12 +23,7 @@
3223
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
3324
import org.springframework.beans.factory.config.DependencyDescriptor;
3425
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
35-
import org.springframework.beans.factory.support.AutowireCandidateResolver;
36-
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
37-
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
38-
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
39-
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
40-
import org.springframework.beans.factory.support.RootBeanDefinition;
26+
import org.springframework.beans.factory.support.*;
4127
import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
4228
import org.springframework.context.support.GenericApplicationContext;
4329
import org.springframework.core.ResolvableType;
@@ -57,6 +43,10 @@
5743
import org.springframework.util.Assert;
5844
import org.springframework.util.StopWatch;
5945

46+
import java.lang.reflect.TypeVariable;
47+
import java.util.*;
48+
import java.util.stream.Collectors;
49+
6050
/**
6151
* Delegate for configuration integration to reuse the general way of detecting repositories. Customization is done by
6252
* providing a configuration format specific {@link RepositoryConfigurationSource} (currently either XML or annotations
@@ -95,7 +85,7 @@ public class RepositoryConfigurationDelegate {
9585
* @param environment must not be {@literal null}.
9686
*/
9787
public RepositoryConfigurationDelegate(RepositoryConfigurationSource configurationSource,
98-
ResourceLoader resourceLoader, Environment environment) {
88+
ResourceLoader resourceLoader, Environment environment) {
9989

10090
this.isXml = configurationSource instanceof XmlRepositoryConfigurationSource;
10191
boolean isAnnotation = configurationSource instanceof AnnotationRepositoryConfigurationSource;
@@ -120,7 +110,7 @@ public RepositoryConfigurationDelegate(RepositoryConfigurationSource configurati
120110
* {@link Environment}.
121111
*/
122112
private static Environment defaultEnvironment(@Nullable Environment environment,
123-
@Nullable ResourceLoader resourceLoader) {
113+
@Nullable ResourceLoader resourceLoader) {
124114

125115
if (environment != null) {
126116
return environment;
@@ -139,7 +129,7 @@ private static Environment defaultEnvironment(@Nullable Environment environment,
139129
* @see org.springframework.beans.factory.support.BeanDefinitionRegistry
140130
*/
141131
public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegistry registry,
142-
RepositoryConfigurationExtension extension) {
132+
RepositoryConfigurationExtension extension) {
143133

144134
if (logger.isInfoEnabled()) {
145135
logger.info(LogMessage.format("Bootstrapping Spring Data %s repositories in %s mode.", //
@@ -225,7 +215,7 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
225215
}
226216

227217
private void registerAotComponents(BeanDefinitionRegistry registry, RepositoryConfigurationExtension extension,
228-
Map<String, RepositoryConfigurationAdapter<?>> metadataByRepositoryBeanName) {
218+
Map<String, RepositoryConfigurationAdapter<?>> metadataByRepositoryBeanName) {
229219

230220
BeanDefinitionBuilder repositoryAotProcessor = BeanDefinitionBuilder
231221
.rootBeanDefinition(extension.getRepositoryAotProcessor()).setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
@@ -248,7 +238,7 @@ private void registerAotComponents(BeanDefinitionRegistry registry, RepositoryCo
248238
* @param registry must not be {@literal null}.
249239
*/
250240
private static void potentiallyLazifyRepositories(Map<String, RepositoryConfiguration<?>> configurations,
251-
BeanDefinitionRegistry registry, BootstrapMode mode) {
241+
BeanDefinitionRegistry registry, BootstrapMode mode) {
252242

253243
if (!(registry instanceof DefaultListableBeanFactory beanFactory) || BootstrapMode.DEFAULT.equals(mode)) {
254244
return;
@@ -272,8 +262,11 @@ private static void potentiallyLazifyRepositories(Map<String, RepositoryConfigur
272262
&& !beanFactory.containsBean(DeferredRepositoryInitializationListener.class.getName())) {
273263

274264
logger.debug("Registering deferred repository initialization listener.");
275-
beanFactory.registerSingleton(DeferredRepositoryInitializationListener.class.getName(),
276-
new DeferredRepositoryInitializationListener(beanFactory));
265+
266+
if (!beanFactory.containsBean(DeferredRepositoryInitializationListener.class.getName())) {
267+
beanFactory.registerSingleton(DeferredRepositoryInitializationListener.class.getName(),
268+
new DeferredRepositoryInitializationListener(beanFactory));
269+
}
277270
}
278271
}
279272

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

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

18-
import static org.assertj.core.api.Assertions.*;
19-
20-
import java.lang.reflect.TypeVariable;
21-
import java.util.List;
22-
import java.util.Optional;
23-
import java.util.UUID;
24-
2518
import org.junit.jupiter.api.Test;
2619
import org.junit.jupiter.api.extension.ExtendWith;
2720
import org.mockito.Mockito;
@@ -59,6 +52,13 @@
5952
import org.springframework.data.repository.sample.AddressRepositoryClient;
6053
import org.springframework.data.repository.sample.ProductRepository;
6154

55+
import java.lang.reflect.TypeVariable;
56+
import java.util.List;
57+
import java.util.Optional;
58+
import java.util.UUID;
59+
60+
import static org.assertj.core.api.Assertions.assertThat;
61+
6262
/**
6363
* Unit tests for {@link RepositoryConfigurationDelegate}.
6464
*

0 commit comments

Comments
 (0)