diff --git a/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java b/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java index 109fbc2b7..aa0e3adfd 100644 --- a/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java +++ b/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java @@ -24,6 +24,7 @@ import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -326,9 +327,31 @@ public abstract class CdiRepositoryBean implements Bean, PassivationCapabl return create(creationalContext, repositoryType, customImplementation); } + /** + * Creates the actual component instance given a {@link RepositoryFactorySupport repository factory supplier} and the + * repository {@link Class type}. This method is an utility for to create a repository. This method will obtain a + * {@link RepositoryFactorySupport repository factory} and configure it with {@link CdiRepositoryConfiguration}. + * + * @param factorySupplier must not be {@literal null}. + * @param repositoryType must not be {@literal null}. + * @return + * @since 2.1 + */ + protected T create(Supplier factorySupplier, Class repositoryType) { + + CdiRepositoryConfiguration configuration = lookupConfiguration(beanManager, qualifiers); + RepositoryFragments repositoryFragments = getRepositoryFragments(repositoryType, configuration); + + RepositoryFactorySupport factory = factorySupplier.get(); + + applyConfiguration(factory, configuration); + + return create(factory, repositoryType, repositoryFragments); + } + /** * Lookup repository fragments for a {@link Class repository interface}. - * + * * @param repositoryType must not be {@literal null}. * @return the {@link RepositoryFragments}. * @since 2.1 @@ -339,11 +362,17 @@ public abstract class CdiRepositoryBean implements Bean, PassivationCapabl CdiRepositoryConfiguration cdiRepositoryConfiguration = lookupConfiguration(beanManager, qualifiers); + return getRepositoryFragments(repositoryType, cdiRepositoryConfiguration); + } + + private RepositoryFragments getRepositoryFragments(Class repositoryType, + CdiRepositoryConfiguration cdiRepositoryConfiguration) { + Optional> customImplementationBean = getCustomImplementationBean(repositoryType, cdiRepositoryConfiguration); Optional customImplementation = customImplementationBean.map(this::getDependencyInstance); - List> repositoryFragments = getRepositoryFragments(repositoryType, + List> repositoryFragments = findRepositoryFragments(repositoryType, cdiRepositoryConfiguration); RepositoryFragments customImplementationFragment = customImplementation // @@ -355,7 +384,7 @@ public abstract class CdiRepositoryBean implements Bean, PassivationCapabl } @SuppressWarnings("unchecked") - private List> getRepositoryFragments(Class repositoryType, + private List> findRepositoryFragments(Class repositoryType, CdiRepositoryConfiguration cdiRepositoryConfiguration) { Stream fragmentConfigurations = context @@ -419,8 +448,7 @@ public abstract class CdiRepositoryBean implements Bean, PassivationCapabl * used when a {@code CustomRepositoryImplementationDetector} is provided. * * @param repositoryType - * @param beanManager - * @param qualifiers + * @param cdiRepositoryConfiguration * @return the custom implementation instance or null */ private Optional> getCustomImplementationBean(Class repositoryType, diff --git a/src/test/java/org/springframework/data/repository/cdi/DummyCdiExtension.java b/src/test/java/org/springframework/data/repository/cdi/DummyCdiExtension.java index f6eb4c240..41d46d7f4 100644 --- a/src/test/java/org/springframework/data/repository/cdi/DummyCdiExtension.java +++ b/src/test/java/org/springframework/data/repository/cdi/DummyCdiExtension.java @@ -76,9 +76,8 @@ public class DummyCdiExtension extends CdiRepositoryExtensionSupport { protected T create(CreationalContext creationalContext, Class repositoryType) { T mock = Mockito.mock(repositoryType); - DummyRepositoryFactory repositoryFactory = new DummyRepositoryFactory(mock); - return create(repositoryFactory, repositoryType, getRepositoryFragments(repositoryType)); + return create(() -> new DummyRepositoryFactory(mock), repositoryType); } }