Browse Source

Expose RepositoryFragments as infrastructure bean.

We now expose RepositoryFragments as a bean to be referenced when creating the actual repository.

Original Pull Request: #2596
pull/2635/head
Christoph Strobl 4 years ago
parent
commit
18a9f3aa13
No known key found for this signature in database
GPG Key ID: 8CC1AB53391458C8
  1. 39
      src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java
  2. 10
      src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java

39
src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java

@ -15,16 +15,20 @@ @@ -15,16 +15,20 @@
*/
package org.springframework.data.repository.config;
import static org.springframework.beans.factory.config.BeanDefinition.*;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
@ -35,6 +39,7 @@ import org.springframework.data.repository.core.support.RepositoryFragment; @@ -35,6 +39,7 @@ import org.springframework.data.repository.core.support.RepositoryFragment;
import org.springframework.data.repository.core.support.RepositoryFragmentsFactoryBean;
import org.springframework.data.util.Optionals;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
/**
* Builder to create {@link BeanDefinitionBuilder} instance to eventually create Spring Data repository instances.
@ -119,17 +124,8 @@ class RepositoryBeanDefinitionBuilder { @@ -119,17 +124,8 @@ class RepositoryBeanDefinitionBuilder {
builder.addDependsOn(it);
});
BeanDefinitionBuilder fragmentsBuilder = BeanDefinitionBuilder
.rootBeanDefinition(RepositoryFragmentsFactoryBean.class);
List<String> fragmentBeanNames = registerRepositoryFragmentsImplementation(configuration) //
.map(RepositoryFragmentConfiguration::getFragmentBeanName) //
.collect(Collectors.toList());
fragmentsBuilder.addConstructorArgValue(fragmentBeanNames);
builder.addPropertyValue("repositoryFragments",
ParsingUtils.getSourceBeanDefinition(fragmentsBuilder, configuration.getSource()));
String fragmentsBeanName = registerRepositoryFragments(configuration);
builder.addPropertyValue("repositoryFragments", new RuntimeBeanReference(fragmentsBeanName));
return builder;
}
@ -161,6 +157,25 @@ class RepositoryBeanDefinitionBuilder { @@ -161,6 +157,25 @@ class RepositoryBeanDefinitionBuilder {
});
}
private String registerRepositoryFragments(RepositoryConfiguration<?> configuration) {
BeanDefinitionBuilder fragmentsBuilder = BeanDefinitionBuilder
.rootBeanDefinition(RepositoryFragmentsFactoryBean.class) //
.setRole(ROLE_INFRASTRUCTURE);
List<String> fragmentBeanNames = registerRepositoryFragmentsImplementation(configuration) //
.map(RepositoryFragmentConfiguration::getFragmentBeanName) //
.collect(Collectors.toList());
fragmentsBuilder.addConstructorArgValue(fragmentBeanNames);
String fragmentsBeanName = BeanDefinitionReaderUtils
.uniqueBeanName(String.format("%s.%s.fragments", extension.getModuleName().toLowerCase(Locale.ROOT),
ClassUtils.getShortName(configuration.getRepositoryInterface())), registry);
registry.registerBeanDefinition(fragmentsBeanName, fragmentsBuilder.getBeanDefinition());
return fragmentsBeanName;
}
private Stream<RepositoryFragmentConfiguration> registerRepositoryFragmentsImplementation(
RepositoryConfiguration<?> configuration) {

10
src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java

@ -78,6 +78,16 @@ class RepositoryBeanDefinitionRegistrarSupportUnitTests { @@ -78,6 +78,16 @@ class RepositoryBeanDefinitionRegistrarSupportUnitTests {
assertNoBeanDefinitionRegisteredFor("profileRepository");
}
@Test // GH-2584
void shouldExposeFragmentsAsBean() {
AnnotationMetadata metadata = new StandardAnnotationMetadata(SampleConfiguration.class, true);
registrar.registerBeanDefinitions(metadata, registry);
verify(registry, atLeast(1)).registerBeanDefinition(eq("commons.MyRepository.fragments#0"), any(BeanDefinition.class));
}
@Test // DATACMNS-1754
void registersBeanDefinitionForNestedRepositories() {

Loading…
Cancel
Save