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 ecf0bf678..8d7e307ee 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java @@ -15,6 +15,8 @@ */ package org.springframework.data.repository.config; +import static org.springframework.beans.factory.support.BeanDefinitionReaderUtils.*; + import java.util.ArrayList; import java.util.List; @@ -25,6 +27,7 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanNameGenerator; +import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.core.env.Environment; import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.env.StandardEnvironment; @@ -104,6 +107,8 @@ public class RepositoryConfigurationDelegate { public List registerRepositoriesIn(BeanDefinitionRegistry registry, RepositoryConfigurationExtension extension) { + exposeRegistration(extension, registry); + extension.registerBeansForRoot(registry, configurationSource); RepositoryBeanDefinitionBuilder builder = new RepositoryBeanDefinitionBuilder(registry, extension, resourceLoader, @@ -137,4 +142,31 @@ public class RepositoryConfigurationDelegate { return definitions; } + + /** + * Registeres the given {@link RepositoryConfigurationExtension} to indicate the repository configuration for a + * particular store (expressed through the extension's concrete type) has appened. Useful for downstream components + * that need to detect exactly that case. The bean definition is marked as lazy-init so that it doesn't get + * instantiated if no one really cares. + * + * @param extension + * @param registry + */ + private void exposeRegistration(RepositoryConfigurationExtension extension, BeanDefinitionRegistry registry) { + + Class extensionType = extension.getClass(); + String beanName = extensionType.getName().concat(GENERATED_BEAN_NAME_SEPARATOR).concat("0"); + + if (registry.containsBeanDefinition(beanName)) { + return; + } + + // Register extension as bean to indicate repository parsing and registration has happened + RootBeanDefinition definition = new RootBeanDefinition(extensionType); + definition.setSource(configurationSource.getSource()); + definition.setRole(AbstractBeanDefinition.ROLE_INFRASTRUCTURE); + definition.setLazyInit(true); + + registry.registerBeanDefinition(beanName, definition); + } } diff --git a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportIntegrationTests.java b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportIntegrationTests.java index c8fed7c8e..92739218e 100644 --- a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportIntegrationTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportIntegrationTests.java @@ -24,6 +24,7 @@ import org.junit.Test; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; +import org.springframework.data.repository.config.RepositoryBeanDefinitionRegistrarSupportUnitTests.DummyConfigurationExtension; /** * Integration tests for {@link RepositoryBeanDefinitionRegistrarSupport}. @@ -77,4 +78,12 @@ public class RepositoryBeanDefinitionRegistrarSupportIntegrationTests { BeanDefinition definition = context.getBeanDefinition("myRepository"); assertThat(definition.getSource(), is(notNullValue())); } + + /** + * @see DATACMNS-544 + */ + @Test + public void registersExtensionAsBeanDefinition() { + assertThat(context.getBean(DummyConfigurationExtension.class), is(notNullValue())); + } } diff --git a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java index f3ddd30d5..8e39c46a3 100644 --- a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java @@ -118,17 +118,19 @@ public class RepositoryBeanDefinitionRegistrarSupportUnitTests { */ @Override protected RepositoryConfigurationExtension getExtension() { - return new RepositoryConfigurationExtensionSupport() { + return new DummyConfigurationExtension(); + } + } - public String getRepositoryFactoryClassName() { - return RepositoryFactoryBeanSupport.class.getName(); - } + static class DummyConfigurationExtension extends RepositoryConfigurationExtensionSupport { - @Override - protected String getModulePrefix() { - return "commons"; - } - }; + public String getRepositoryFactoryClassName() { + return RepositoryFactoryBeanSupport.class.getName(); + } + + @Override + protected String getModulePrefix() { + return "commons"; } } }