DATACMNS-544 - Indicate repository configuration has been active.

RepositoryConfigurationDelegate now registers the store-specific RepositoryConfigurationExtension as lazy-init BeanDefinition so that other parties can detect that definition.
This commit is contained in:
Oliver Gierke
2014-07-18 20:02:49 +02:00
parent 5aa5b9e1aa
commit 5bc89af4e7
3 changed files with 52 additions and 9 deletions

View File

@@ -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<BeanComponentDefinition> 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<? extends RepositoryConfigurationExtension> 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);
}
}

View File

@@ -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()));
}
}

View File

@@ -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";
}
}
}