diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java index fb89ca773..3d81069eb 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java @@ -25,7 +25,6 @@ import java.util.stream.Collectors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableBeanFactory; @@ -34,6 +33,7 @@ import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; 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.context.annotation.ContextAnnotationAutowireCandidateResolver; @@ -225,15 +225,13 @@ public class RepositoryConfigurationDelegate { String repositoryAotProcessorBeanName = String.format("data-%s.repository-aot-processor" /* might be duplicate */, extension.getModuleIdentifier()); - if (!registry.isBeanNameInUse(repositoryAotProcessorBeanName)) { + BeanDefinitionBuilder repositoryAotProcessor = BeanDefinitionBuilder + .rootBeanDefinition(extension.getRepositoryAotProcessor()).setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - BeanDefinitionBuilder repositoryAotProcessor = BeanDefinitionBuilder - .rootBeanDefinition(extension.getRepositoryAotProcessor()).setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + repositoryAotProcessor.addPropertyValue("configMap", metadataByRepositoryBeanName); - repositoryAotProcessor.addPropertyValue("configMap", metadataByRepositoryBeanName); - - registry.registerBeanDefinition(repositoryAotProcessorBeanName, repositoryAotProcessor.getBeanDefinition()); - } + registry.registerBeanDefinition(BeanDefinitionReaderUtils.uniqueBeanName(repositoryAotProcessorBeanName, registry), + repositoryAotProcessor.getBeanDefinition()); } /** diff --git a/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java b/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java index 9b88cfcc3..0b441719f 100644 --- a/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java @@ -23,8 +23,8 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; - import org.springframework.aop.framework.Advised; +import org.springframework.aot.hint.RuntimeHints; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.context.annotation.AnnotationBeanNameGenerator; @@ -194,6 +194,29 @@ class RepositoryConfigurationDelegateUnitTests { assertThat(context.getBeanFactory().getBeanDefinition("fragmentFragment")).isNotNull(); } + @Test // GH-2760 + void registersAotPostProcessorForDifferentConfigurations() { + + var environment = new StandardEnvironment(); + var context = new GenericApplicationContext(); + context.setAllowBeanDefinitionOverriding(false); + + RepositoryConfigurationSource configSource = new AnnotationRepositoryConfigurationSource( + AnnotationMetadata.introspect(AnnotatedBeanNamesConfig.class), EnableRepositories.class, context, environment, + context.getDefaultListableBeanFactory(), new AnnotationBeanNameGenerator()); + + new RepositoryConfigurationDelegate(configSource, context, environment).registerRepositoriesIn(context, extension); + + RepositoryConfigurationSource configSource2 = new AnnotationRepositoryConfigurationSource( + AnnotationMetadata.introspect(TestConfig.class), EnableRepositories.class, context, environment, + context.getDefaultListableBeanFactory(), new AnnotationBeanNameGenerator()); + + new RepositoryConfigurationDelegate(configSource2, context, environment).registerRepositoriesIn(context, extension); + + context.refreshForAotProcessing(new RuntimeHints()); + assertThat(context.getBeanNamesForType(RepositoryRegistrationAotProcessor.class)).hasSize(2); + } + private static ListableBeanFactory assertLazyRepositoryBeanSetup(Class configClass) { var context = new AnnotationConfigApplicationContext(configClass);