Skip to content

Commit 18a9f3a

Browse files
Expose RepositoryFragments as infrastructure bean.
We now expose RepositoryFragments as a bean to be referenced when creating the actual repository. Original Pull Request: #2596
1 parent 712477b commit 18a9f3a

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

Diff for: src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java

+27-12
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,20 @@
1515
*/
1616
package org.springframework.data.repository.config;
1717

18+
import static org.springframework.beans.factory.config.BeanDefinition.*;
19+
1820
import java.util.List;
21+
import java.util.Locale;
1922
import java.util.Optional;
2023
import java.util.stream.Collectors;
2124
import java.util.stream.Stream;
2225

2326
import org.apache.commons.logging.Log;
2427
import org.apache.commons.logging.LogFactory;
25-
28+
import org.springframework.beans.factory.config.RuntimeBeanReference;
2629
import org.springframework.beans.factory.support.AbstractBeanDefinition;
2730
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
31+
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
2832
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2933
import org.springframework.core.env.Environment;
3034
import org.springframework.core.io.ResourceLoader;
@@ -35,6 +39,7 @@
3539
import org.springframework.data.repository.core.support.RepositoryFragmentsFactoryBean;
3640
import org.springframework.data.util.Optionals;
3741
import org.springframework.util.Assert;
42+
import org.springframework.util.ClassUtils;
3843

3944
/**
4045
* Builder to create {@link BeanDefinitionBuilder} instance to eventually create Spring Data repository instances.
@@ -119,17 +124,8 @@ public BeanDefinitionBuilder build(RepositoryConfiguration<?> configuration) {
119124
builder.addDependsOn(it);
120125
});
121126

122-
BeanDefinitionBuilder fragmentsBuilder = BeanDefinitionBuilder
123-
.rootBeanDefinition(RepositoryFragmentsFactoryBean.class);
124-
125-
List<String> fragmentBeanNames = registerRepositoryFragmentsImplementation(configuration) //
126-
.map(RepositoryFragmentConfiguration::getFragmentBeanName) //
127-
.collect(Collectors.toList());
128-
129-
fragmentsBuilder.addConstructorArgValue(fragmentBeanNames);
130-
131-
builder.addPropertyValue("repositoryFragments",
132-
ParsingUtils.getSourceBeanDefinition(fragmentsBuilder, configuration.getSource()));
127+
String fragmentsBeanName = registerRepositoryFragments(configuration);
128+
builder.addPropertyValue("repositoryFragments", new RuntimeBeanReference(fragmentsBeanName));
133129

134130
return builder;
135131
}
@@ -161,6 +157,25 @@ private Optional<String> registerCustomImplementation(RepositoryConfiguration<?>
161157
});
162158
}
163159

160+
private String registerRepositoryFragments(RepositoryConfiguration<?> configuration) {
161+
162+
BeanDefinitionBuilder fragmentsBuilder = BeanDefinitionBuilder
163+
.rootBeanDefinition(RepositoryFragmentsFactoryBean.class) //
164+
.setRole(ROLE_INFRASTRUCTURE);
165+
166+
List<String> fragmentBeanNames = registerRepositoryFragmentsImplementation(configuration) //
167+
.map(RepositoryFragmentConfiguration::getFragmentBeanName) //
168+
.collect(Collectors.toList());
169+
170+
fragmentsBuilder.addConstructorArgValue(fragmentBeanNames);
171+
172+
String fragmentsBeanName = BeanDefinitionReaderUtils
173+
.uniqueBeanName(String.format("%s.%s.fragments", extension.getModuleName().toLowerCase(Locale.ROOT),
174+
ClassUtils.getShortName(configuration.getRepositoryInterface())), registry);
175+
registry.registerBeanDefinition(fragmentsBeanName, fragmentsBuilder.getBeanDefinition());
176+
return fragmentsBeanName;
177+
}
178+
164179
private Stream<RepositoryFragmentConfiguration> registerRepositoryFragmentsImplementation(
165180
RepositoryConfiguration<?> configuration) {
166181

Diff for: src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java

+10
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ void registersBeanDefinitionForFoundBean() {
7878
assertNoBeanDefinitionRegisteredFor("profileRepository");
7979
}
8080

81+
82+
@Test // GH-2584
83+
void shouldExposeFragmentsAsBean() {
84+
85+
AnnotationMetadata metadata = new StandardAnnotationMetadata(SampleConfiguration.class, true);
86+
87+
registrar.registerBeanDefinitions(metadata, registry);
88+
verify(registry, atLeast(1)).registerBeanDefinition(eq("commons.MyRepository.fragments#0"), any(BeanDefinition.class));
89+
}
90+
8191
@Test // DATACMNS-1754
8292
void registersBeanDefinitionForNestedRepositories() {
8393

0 commit comments

Comments
 (0)