Skip to content

Commit

Permalink
Expose RepositoryFragments as infrastructure bean.
Browse files Browse the repository at this point in the history
We now expose RepositoryFragments as a bean to be referenced when creating the actual repository.

Original Pull Request: #2596
  • Loading branch information
christophstrobl committed Jun 13, 2022
1 parent 712477b commit 18a9f3a
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -35,6 +39,7 @@
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.
Expand Down Expand Up @@ -119,17 +124,8 @@ public BeanDefinitionBuilder build(RepositoryConfiguration<?> configuration) {
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;
}
Expand Down Expand Up @@ -161,6 +157,25 @@ private Optional<String> registerCustomImplementation(RepositoryConfiguration<?>
});
}

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) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,16 @@ void registersBeanDefinitionForFoundBean() {
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() {

Expand Down

0 comments on commit 18a9f3a

Please sign in to comment.