Browse Source

Avoid multiple `DeferredRepositoryInitializationListener` registrations in `RepositoryConfigurationDelegate`.

Closes #3287
Original pull request: #3219
pull/3304/head
xeounxzxu 1 year ago committed by Mark Paluch
parent
commit
77b9cbd5b2
No known key found for this signature in database
GPG Key ID: 55BC6374BAA9D973
  1. 37
      src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java
  2. 14
      src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java

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

@ -15,15 +15,6 @@ @@ -15,15 +15,6 @@
*/
package org.springframework.data.repository.config;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jspecify.annotations.Nullable;
@ -32,12 +23,7 @@ import org.springframework.beans.factory.config.BeanDefinition; @@ -32,12 +23,7 @@ import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.config.DependencyDescriptor;
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
import org.springframework.beans.factory.support.AutowireCandidateResolver;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.support.*;
import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.ResolvableType;
@ -57,6 +43,10 @@ import org.springframework.data.util.ClassUtils; @@ -57,6 +43,10 @@ import org.springframework.data.util.ClassUtils;
import org.springframework.util.Assert;
import org.springframework.util.StopWatch;
import java.lang.reflect.TypeVariable;
import java.util.*;
import java.util.stream.Collectors;
/**
* Delegate for configuration integration to reuse the general way of detecting repositories. Customization is done by
* providing a configuration format specific {@link RepositoryConfigurationSource} (currently either XML or annotations
@ -95,7 +85,7 @@ public class RepositoryConfigurationDelegate { @@ -95,7 +85,7 @@ public class RepositoryConfigurationDelegate {
* @param environment must not be {@literal null}.
*/
public RepositoryConfigurationDelegate(RepositoryConfigurationSource configurationSource,
ResourceLoader resourceLoader, Environment environment) {
ResourceLoader resourceLoader, Environment environment) {
this.isXml = configurationSource instanceof XmlRepositoryConfigurationSource;
boolean isAnnotation = configurationSource instanceof AnnotationRepositoryConfigurationSource;
@ -120,7 +110,7 @@ public class RepositoryConfigurationDelegate { @@ -120,7 +110,7 @@ public class RepositoryConfigurationDelegate {
* {@link Environment}.
*/
private static Environment defaultEnvironment(@Nullable Environment environment,
@Nullable ResourceLoader resourceLoader) {
@Nullable ResourceLoader resourceLoader) {
if (environment != null) {
return environment;
@ -139,7 +129,7 @@ public class RepositoryConfigurationDelegate { @@ -139,7 +129,7 @@ public class RepositoryConfigurationDelegate {
* @see org.springframework.beans.factory.support.BeanDefinitionRegistry
*/
public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegistry registry,
RepositoryConfigurationExtension extension) {
RepositoryConfigurationExtension extension) {
if (logger.isInfoEnabled()) {
logger.info(LogMessage.format("Bootstrapping Spring Data %s repositories in %s mode.", //
@ -225,7 +215,7 @@ public class RepositoryConfigurationDelegate { @@ -225,7 +215,7 @@ public class RepositoryConfigurationDelegate {
}
private void registerAotComponents(BeanDefinitionRegistry registry, RepositoryConfigurationExtension extension,
Map<String, RepositoryConfigurationAdapter<?>> metadataByRepositoryBeanName) {
Map<String, RepositoryConfigurationAdapter<?>> metadataByRepositoryBeanName) {
BeanDefinitionBuilder repositoryAotProcessor = BeanDefinitionBuilder
.rootBeanDefinition(extension.getRepositoryAotProcessor()).setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
@ -248,7 +238,7 @@ public class RepositoryConfigurationDelegate { @@ -248,7 +238,7 @@ public class RepositoryConfigurationDelegate {
* @param registry must not be {@literal null}.
*/
private static void potentiallyLazifyRepositories(Map<String, RepositoryConfiguration<?>> configurations,
BeanDefinitionRegistry registry, BootstrapMode mode) {
BeanDefinitionRegistry registry, BootstrapMode mode) {
if (!(registry instanceof DefaultListableBeanFactory beanFactory) || BootstrapMode.DEFAULT.equals(mode)) {
return;
@ -272,8 +262,11 @@ public class RepositoryConfigurationDelegate { @@ -272,8 +262,11 @@ public class RepositoryConfigurationDelegate {
&& !beanFactory.containsBean(DeferredRepositoryInitializationListener.class.getName())) {
logger.debug("Registering deferred repository initialization listener.");
beanFactory.registerSingleton(DeferredRepositoryInitializationListener.class.getName(),
new DeferredRepositoryInitializationListener(beanFactory));
if (!beanFactory.containsBean(DeferredRepositoryInitializationListener.class.getName())) {
beanFactory.registerSingleton(DeferredRepositoryInitializationListener.class.getName(),
new DeferredRepositoryInitializationListener(beanFactory));
}
}
}

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

@ -15,13 +15,6 @@ @@ -15,13 +15,6 @@
*/
package org.springframework.data.repository.config;
import static org.assertj.core.api.Assertions.*;
import java.lang.reflect.TypeVariable;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mockito;
@ -59,6 +52,13 @@ import org.springframework.data.repository.sample.AddressRepository; @@ -59,6 +52,13 @@ import org.springframework.data.repository.sample.AddressRepository;
import org.springframework.data.repository.sample.AddressRepositoryClient;
import org.springframework.data.repository.sample.ProductRepository;
import java.lang.reflect.TypeVariable;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Unit tests for {@link RepositoryConfigurationDelegate}.
*

Loading…
Cancel
Save