From e22b1648bffa7b55350b4fed55dbb79bf3bd29d6 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Mon, 9 Feb 2026 17:16:05 +0000 Subject: [PATCH] Cache HandlerMethod with resolved bean if singleton See gh-36278 --- .../web/method/HandlerMethod.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java b/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java index 746e0f3950e..04aef80e148 100644 --- a/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java +++ b/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java @@ -91,6 +91,8 @@ public class HandlerMethod extends AnnotatedMethod { private @Nullable HandlerMethod resolvedFromHandlerMethod; + private @Nullable HandlerMethod resolvedBeanHandlerMethod; + private final String description; @@ -298,8 +300,10 @@ public class HandlerMethod extends AnnotatedMethod { } /** - * Return the HandlerMethod from which this HandlerMethod instance was - * resolved via {@link #createWithResolvedBean()}. + * Return the original HandlerMethod instance that from which the current + * HandlerMethod instance was created via either + * {@link #createWithValidateFlags()} or {@link #createWithResolvedBean()}. + * The original instance is needed for cached CORS config lookups. */ public @Nullable HandlerMethod getResolvedFromHandlerMethod() { return this.resolvedFromHandlerMethod; @@ -322,6 +326,10 @@ public class HandlerMethod extends AnnotatedMethod { *

If the {@link #getBean() handler} is not String, return the same instance. */ public HandlerMethod createWithResolvedBean() { + if (this.resolvedBeanHandlerMethod != null) { + return this.resolvedBeanHandlerMethod; + } + if (!(this.bean instanceof String beanName)) { return this; } @@ -329,7 +337,13 @@ public class HandlerMethod extends AnnotatedMethod { Assert.state(this.beanFactory != null, "Cannot resolve bean name without BeanFactory"); Object handler = this.beanFactory.getBean(beanName); Assert.notNull(handler, "No handler instance"); - return new HandlerMethod(this, handler, false); + + HandlerMethod handlerMethod = new HandlerMethod(this, handler, false); + if (this.beanFactory.isSingleton(beanName)) { + this.resolvedBeanHandlerMethod = handlerMethod; + } + + return handlerMethod; } /**