From 6162d89042db2d11f3d1fe1e5896f8ded65d96a1 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 2f0042999dd..32423044ed3 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 @@ -96,6 +96,8 @@ public class HandlerMethod extends AnnotatedMethod { @Nullable private HandlerMethod resolvedFromHandlerMethod; + private @Nullable HandlerMethod resolvedBeanHandlerMethod; + private final String description; @@ -305,8 +307,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. */ @Nullable public HandlerMethod getResolvedFromHandlerMethod() { @@ -330,6 +334,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; } @@ -337,7 +345,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; } /**