diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java b/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java index 38813f4308..0b133286eb 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java @@ -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.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 @@ public BeanDefinitionBuilder build(RepositoryConfiguration configuration) { builder.addDependsOn(it); }); - BeanDefinitionBuilder fragmentsBuilder = BeanDefinitionBuilder - .rootBeanDefinition(RepositoryFragmentsFactoryBean.class); - - List 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 @@ private Optional registerCustomImplementation(RepositoryConfiguration }); } + private String registerRepositoryFragments(RepositoryConfiguration configuration) { + + BeanDefinitionBuilder fragmentsBuilder = BeanDefinitionBuilder + .rootBeanDefinition(RepositoryFragmentsFactoryBean.class) // + .setRole(ROLE_INFRASTRUCTURE); + + List 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 registerRepositoryFragmentsImplementation( RepositoryConfiguration configuration) { 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 b56be30041..861e5226b6 100755 --- a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java @@ -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() {