DATACMNS-1534 - Cache BeanFactory lookup for EvaluationContextExtension.

We now cache the BeanFactory lookup for EvaluationContextExtension within the ExtensionAwareEvalutationContextProvider to avoid (expensive) repeated context scans when creating the actual EvaluationContext.

Original pull request: #395.
This commit is contained in:
Christoph Strobl
2019-05-14 10:31:56 +02:00
committed by Oliver Drotbohm
parent 15969ee01f
commit d6bb21d24f
3 changed files with 41 additions and 9 deletions

View File

@@ -16,6 +16,9 @@
package org.springframework.data.repository.query;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import lombok.RequiredArgsConstructor;
@@ -31,10 +34,13 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.spel.ExtensionAwareEvaluationContextProvider;
import org.springframework.data.spel.spi.EvaluationContextExtension;
import org.springframework.data.spel.spi.Function;
import org.springframework.expression.EvaluationContext;
@@ -279,6 +285,33 @@ public class ExtensionAwareEvaluationContextProviderUnitTests {
assertThat(evaluateExpression("methodWithVarArgs('one', 'two')")).isEqualTo("varargs");
}
@Test // DATACMNS-1534
public void contextProviderShouldLazilyLookUpExtensions() {
ListableBeanFactory beanFactory = Mockito.mock(ListableBeanFactory.class);
ExtensionAwareEvaluationContextProvider contextProvider = new ExtensionAwareEvaluationContextProvider(beanFactory);
verify(beanFactory, never()).getBeansOfType(eq(EvaluationContextExtension.class), anyBoolean(), anyBoolean());
contextProvider.getEvaluationContext(null);
verify(beanFactory).getBeansOfType(eq(EvaluationContextExtension.class), anyBoolean(), anyBoolean());
}
@Test // DATACMNS-1534
public void contextProviderShouldLookupExtensionsOnlyOnce() {
ListableBeanFactory beanFactory = Mockito.mock(ListableBeanFactory.class);
ExtensionAwareEvaluationContextProvider contextProvider = new ExtensionAwareEvaluationContextProvider(beanFactory);
contextProvider.getEvaluationContext(null);
contextProvider.getEvaluationContext(null);
verify(beanFactory).getBeansOfType(eq(EvaluationContextExtension.class), anyBoolean(), anyBoolean());
}
private static ExtensionAwareQueryMethodEvaluationContextProvider createContextProviderWithOverloads() {
return new ExtensionAwareQueryMethodEvaluationContextProvider(Collections.singletonList( //