From 87fa658df34a612ab5e89148b1b6f3eb5af4dd2a Mon Sep 17 00:00:00 2001 From: hebo <13216192626@163.com> Date: Wed, 1 Jun 2022 07:46:09 +0800 Subject: [PATCH 1/2] support spel in AsyncExecutionAspectSupport --- .../interceptor/AsyncExecutionAspectSupport.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java index 50a62a0f84a0..51efde0f49d0 100644 --- a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java +++ b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java @@ -43,6 +43,7 @@ import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; +import org.springframework.util.StringValueResolver; import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.function.SingletonSupplier; @@ -59,6 +60,7 @@ * @author Chris Beams * @author Juergen Hoeller * @author Stephane Nicoll + * @author He Bo * @since 3.1.2 */ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware { @@ -83,6 +85,8 @@ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware { @Nullable private BeanFactory beanFactory; + @Nullable + private StringValueResolver stringValueResolver; /** * Create a new instance with a default {@link AsyncUncaughtExceptionHandler}. @@ -153,6 +157,9 @@ public void setExceptionHandler(AsyncUncaughtExceptionHandler exceptionHandler) @Override public void setBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; + if (beanFactory instanceof ConfigurableBeanFactory configurableBeanFactory) { + this.stringValueResolver = new EmbeddedValueResolver(configurableBeanFactory); + } } @@ -167,6 +174,9 @@ protected AsyncTaskExecutor determineAsyncExecutor(Method method) { if (executor == null) { Executor targetExecutor; String qualifier = getExecutorQualifier(method); + if (stringValueResolver != null && StringUtils.hasLength(qualifier)) { + qualifier = stringValueResolver.resolveStringValue(qualifier); + } if (StringUtils.hasLength(qualifier)) { targetExecutor = findQualifiedExecutor(this.beanFactory, qualifier); } @@ -210,10 +220,6 @@ protected Executor findQualifiedExecutor(@Nullable BeanFactory beanFactory, Stri throw new IllegalStateException("BeanFactory must be set on " + getClass().getSimpleName() + " to access qualified executor '" + qualifier + "'"); } - if (beanFactory instanceof ConfigurableBeanFactory configurableBeanFactory) { - EmbeddedValueResolver embeddedValueResolver = new EmbeddedValueResolver(configurableBeanFactory); - qualifier = embeddedValueResolver.resolveStringValue(qualifier); - } return BeanFactoryAnnotationUtils.qualifiedBeanOfType(beanFactory, Executor.class, qualifier); } From 6c2d2f77d33aa9cf47948cfc3b4a3fff52253e32 Mon Sep 17 00:00:00 2001 From: hebo <13216192626@163.com> Date: Fri, 3 Jun 2022 08:49:15 +0800 Subject: [PATCH 2/2] add test for spring-projects#28549: optimize spel in AsyncExecutionAspectSupport --- .../aop/interceptor/AsyncExecutionAspectSupport.java | 4 ++-- .../scheduling/annotation/EnableAsyncTests.java | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java index 51efde0f49d0..1d43365ba0b7 100644 --- a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java +++ b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java @@ -174,8 +174,8 @@ protected AsyncTaskExecutor determineAsyncExecutor(Method method) { if (executor == null) { Executor targetExecutor; String qualifier = getExecutorQualifier(method); - if (stringValueResolver != null && StringUtils.hasLength(qualifier)) { - qualifier = stringValueResolver.resolveStringValue(qualifier); + if (this.stringValueResolver != null && StringUtils.hasLength(qualifier)) { + qualifier = this.stringValueResolver.resolveStringValue(qualifier); } if (StringUtils.hasLength(qualifier)) { targetExecutor = findQualifiedExecutor(this.beanFactory, qualifier); diff --git a/spring-context/src/test/java/org/springframework/scheduling/annotation/EnableAsyncTests.java b/spring-context/src/test/java/org/springframework/scheduling/annotation/EnableAsyncTests.java index 08c182785c28..e47c9af30e44 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/annotation/EnableAsyncTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/annotation/EnableAsyncTests.java @@ -146,6 +146,9 @@ public void withAsyncBeanWithExecutorQualifiedByExpressionOrPlaceholder() throws Future workerThread2 = asyncBean.myWork2(); assertThat(workerThread2.get().getName()).startsWith("myExecutor2-"); + + Future workerThread3 = asyncBean.defaultExecutor(); + assertThat(workerThread3.get().getName()).startsWith("SimpleAsyncTaskExecutor"); } finally { System.clearProperty("myExecutor"); @@ -380,6 +383,11 @@ public Future myWork1() { public Future myWork2() { return new AsyncResult<>(Thread.currentThread()); } + + @Async("${my.app.targetExecutor:}") + public Future defaultExecutor() { + return new AsyncResult<>(Thread.currentThread()); + } }