6060import org .springframework .data .repository .query .QueryMethodEvaluationContextProvider ;
6161import org .springframework .data .repository .query .RepositoryQuery ;
6262import org .springframework .data .repository .util .QueryExecutionConverters ;
63+ import org .springframework .data .util .Lazy ;
6364import org .springframework .data .util .ReflectionUtils ;
6465import org .springframework .lang .Nullable ;
6566import 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