Skip to content

Commit 4e528a5

Browse files
committed
Allow reuse of ProjectionFactory from RepositoryFactorySupport.
Closes #2441
1 parent 5111811 commit 4e528a5

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

src/main/java/org/springframework/data/repository/core/support/RepositoryFactorySupport.java

+20-2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
6161
import org.springframework.data.repository.query.RepositoryQuery;
6262
import org.springframework.data.repository.util.QueryExecutionConverters;
63+
import org.springframework.data.util.Lazy;
6364
import org.springframework.data.util.ReflectionUtils;
6465
import org.springframework.lang.Nullable;
6566
import org.springframework.transaction.interceptor.TransactionalProxy;
@@ -101,6 +102,7 @@ public abstract class RepositoryFactorySupport implements BeanClassLoaderAware,
101102
private ClassLoader classLoader;
102103
private QueryMethodEvaluationContextProvider evaluationContextProvider;
103104
private BeanFactory beanFactory;
105+
private Lazy<ProjectionFactory> projectionFactory;
104106

105107
private final QueryCollectingQueryCreationListener collectingListener = new QueryCollectingQueryCreationListener();
106108

@@ -117,6 +119,7 @@ public RepositoryFactorySupport() {
117119
this.queryPostProcessors = new ArrayList<>();
118120
this.queryPostProcessors.add(collectingListener);
119121
this.methodInvocationListeners = new ArrayList<>();
122+
this.projectionFactory = createProjectionFactory();
120123
}
121124

122125
/**
@@ -144,6 +147,7 @@ public void setNamedQueries(NamedQueries namedQueries) {
144147
@Override
145148
public void setBeanClassLoader(ClassLoader classLoader) {
146149
this.classLoader = classLoader == null ? org.springframework.util.ClassUtils.getDefaultClassLoader() : classLoader;
150+
this.projectionFactory = createProjectionFactory();
147151
}
148152

149153
/*
@@ -153,6 +157,7 @@ public void setBeanClassLoader(ClassLoader classLoader) {
153157
@Override
154158
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
155159
this.beanFactory = beanFactory;
160+
this.projectionFactory = createProjectionFactory();
156161
}
157162

158163
/**
@@ -354,10 +359,9 @@ public <T> T getRepository(Class<T> repositoryInterface, RepositoryFragments fra
354359
result.addAdvice(new DefaultMethodInvokingMethodInterceptor());
355360
}
356361

357-
ProjectionFactory projectionFactory = getProjectionFactory(classLoader, beanFactory);
358362
Optional<QueryLookupStrategy> queryLookupStrategy = getQueryLookupStrategy(queryLookupStrategyKey,
359363
evaluationContextProvider);
360-
result.addAdvice(new QueryExecutorMethodInterceptor(information, projectionFactory, queryLookupStrategy,
364+
result.addAdvice(new QueryExecutorMethodInterceptor(information, getProjectionFactory(), queryLookupStrategy,
361365
namedQueries, queryPostProcessors, methodInvocationListeners));
362366

363367
result.addAdvice(
@@ -456,6 +460,16 @@ protected List<QueryMethod> getQueryMethods() {
456460
return collectingListener.getQueryMethods();
457461
}
458462

463+
/**
464+
* Returns a {@link ProjectionFactory} instance.
465+
*
466+
* @return
467+
* @since 2.6
468+
*/
469+
protected ProjectionFactory getProjectionFactory() {
470+
return projectionFactory.get();
471+
}
472+
459473
/**
460474
* Returns the {@link EntityInformation} for the given domain class.
461475
*
@@ -586,6 +600,10 @@ private StartupStep onEvent(ApplicationStartup applicationStartup, String name,
586600
return step.tag("repository", repositoryInterface.getName());
587601
}
588602

603+
private Lazy<ProjectionFactory> createProjectionFactory() {
604+
return Lazy.of(() -> getProjectionFactory(this.classLoader, this.beanFactory));
605+
}
606+
589607
/**
590608
* Method interceptor that calls methods on the {@link RepositoryComposition}.
591609
*

0 commit comments

Comments
 (0)