diff --git a/spring-context/src/main/java/org/springframework/resilience/annotation/ConcurrencyLimit.java b/spring-context/src/main/java/org/springframework/resilience/annotation/ConcurrencyLimit.java
index 465ba44bb5b..d042b5c1d6a 100644
--- a/spring-context/src/main/java/org/springframework/resilience/annotation/ConcurrencyLimit.java
+++ b/spring-context/src/main/java/org/springframework/resilience/annotation/ConcurrencyLimit.java
@@ -42,6 +42,7 @@ import org.springframework.aot.hint.annotation.Reflective;
* {@link org.springframework.aop.interceptor.ConcurrencyThrottleInterceptor}.
*
* @author Juergen Hoeller
+ * @author Hyunsang Han
* @since 7.0
* @see EnableResilientMethods
* @see ConcurrencyLimitBeanPostProcessor
@@ -62,4 +63,12 @@ public @interface ConcurrencyLimit {
*/
int value() default 1;
+ /**
+ * The concurrency limit as a configurable String.
+ * A non-empty value specified here overrides the {@link #value()} attribute.
+ *
This supports Spring-style "${...}" placeholders as well as SpEL expressions.
+ * @see #value()
+ */
+ String valueString() default "";
+
}
diff --git a/spring-context/src/main/java/org/springframework/resilience/annotation/ConcurrencyLimitBeanPostProcessor.java b/spring-context/src/main/java/org/springframework/resilience/annotation/ConcurrencyLimitBeanPostProcessor.java
index c556c7d52ba..2f133cb65f2 100644
--- a/spring-context/src/main/java/org/springframework/resilience/annotation/ConcurrencyLimitBeanPostProcessor.java
+++ b/spring-context/src/main/java/org/springframework/resilience/annotation/ConcurrencyLimitBeanPostProcessor.java
@@ -31,9 +31,12 @@ import org.springframework.aop.interceptor.ConcurrencyThrottleInterceptor;
import org.springframework.aop.support.ComposablePointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.annotation.AnnotationMatchingPointcut;
+import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.util.Assert;
import org.springframework.util.ConcurrentReferenceHashMap;
+import org.springframework.util.StringUtils;
+import org.springframework.util.StringValueResolver;
/**
* A convenient {@link org.springframework.beans.factory.config.BeanPostProcessor
@@ -41,10 +44,14 @@ import org.springframework.util.ConcurrentReferenceHashMap;
* annotated with {@link ConcurrencyLimit @ConcurrencyLimit}.
*
* @author Juergen Hoeller
+ * @author Hyunsang Han
* @since 7.0
*/
@SuppressWarnings("serial")
-public class ConcurrencyLimitBeanPostProcessor extends AbstractBeanFactoryAwareAdvisingPostProcessor {
+public class ConcurrencyLimitBeanPostProcessor extends AbstractBeanFactoryAwareAdvisingPostProcessor
+ implements EmbeddedValueResolverAware {
+
+ private @Nullable StringValueResolver embeddedValueResolver;
public ConcurrencyLimitBeanPostProcessor() {
setBeforeExistingAdvisors(true);
@@ -57,7 +64,13 @@ public class ConcurrencyLimitBeanPostProcessor extends AbstractBeanFactoryAwareA
}
- private static class ConcurrencyLimitInterceptor implements MethodInterceptor {
+ @Override
+ public void setEmbeddedValueResolver(StringValueResolver resolver) {
+ this.embeddedValueResolver = resolver;
+ }
+
+
+ private class ConcurrencyLimitInterceptor implements MethodInterceptor {
private final Map