Skip to content

Commit a065563

Browse files
committed
Optimize RequestMappingInfo hashcode calculation
Precalculated hashcode makes sense for infos in the registry, but matched infos created on the fly don't need it. Closes gh-36279
1 parent 6162d89 commit a065563

1 file changed

Lines changed: 29 additions & 15 deletions

File tree

spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfo.java

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public final class RequestMappingInfo implements RequestCondition<RequestMapping
103103

104104
private final RequestConditionHolder customConditionHolder;
105105

106-
private final int hashCode;
106+
private @Nullable Integer hashCode;
107107

108108
private final BuilderConfiguration options;
109109

@@ -162,6 +162,21 @@ private RequestMappingInfo(@Nullable String name,
162162
ProducesRequestCondition producesCondition, RequestConditionHolder customCondition,
163163
BuilderConfiguration options) {
164164

165+
this(name, pathPatternsCondition, patternsCondition,
166+
methodsCondition, paramsCondition, headersCondition,
167+
consumesCondition, producesCondition,
168+
customCondition, options, true);
169+
}
170+
171+
private RequestMappingInfo(@Nullable String name,
172+
@Nullable PathPatternsRequestCondition pathPatternsCondition,
173+
@Nullable PatternsRequestCondition patternsCondition,
174+
RequestMethodsRequestCondition methodsCondition, ParamsRequestCondition paramsCondition,
175+
HeadersRequestCondition headersCondition, ConsumesRequestCondition consumesCondition,
176+
ProducesRequestCondition producesCondition,
177+
RequestConditionHolder customCondition, BuilderConfiguration options,
178+
boolean calculateHashCode) {
179+
165180
Assert.isTrue(pathPatternsCondition != null || patternsCondition != null,
166181
"Neither PathPatterns nor String patterns condition");
167182

@@ -176,10 +191,9 @@ private RequestMappingInfo(@Nullable String name,
176191
this.customConditionHolder = customCondition;
177192
this.options = options;
178193

179-
this.hashCode = calculateHashCode(
180-
this.pathPatternsCondition, this.patternsCondition,
181-
this.methodsCondition, this.paramsCondition, this.headersCondition,
182-
this.consumesCondition, this.producesCondition, this.customConditionHolder);
194+
if (calculateHashCode) {
195+
this.hashCode = calculateHashCode();
196+
}
183197
}
184198

185199

@@ -421,7 +435,7 @@ public RequestMappingInfo getMatchingCondition(HttpServletRequest request) {
421435
return null;
422436
}
423437
return new RequestMappingInfo(this.name, pathPatterns, patterns,
424-
methods, params, headers, consumes, produces, custom, this.options);
438+
methods, params, headers, consumes, produces, custom, this.options, false);
425439
}
426440

427441
/**
@@ -487,19 +501,19 @@ public boolean equals(@Nullable Object other) {
487501

488502
@Override
489503
public int hashCode() {
504+
if (this.hashCode == null) {
505+
this.hashCode = calculateHashCode();
506+
}
490507
return this.hashCode;
491508
}
492509

493510
@SuppressWarnings({"ConstantConditions", "NullAway"})
494-
private static int calculateHashCode(
495-
@Nullable PathPatternsRequestCondition pathPatterns, @Nullable PatternsRequestCondition patterns,
496-
RequestMethodsRequestCondition methods, ParamsRequestCondition params, HeadersRequestCondition headers,
497-
ConsumesRequestCondition consumes, ProducesRequestCondition produces, RequestConditionHolder custom) {
498-
499-
return (pathPatterns != null ? pathPatterns : patterns).hashCode() * 31 +
500-
methods.hashCode() + params.hashCode() +
501-
headers.hashCode() + consumes.hashCode() + produces.hashCode() +
502-
custom.hashCode();
511+
private int calculateHashCode() {
512+
return (this.pathPatternsCondition != null ? this.pathPatternsCondition : this.patternsCondition).hashCode() * 31 +
513+
this.methodsCondition.hashCode() +
514+
this.paramsCondition.hashCode() + this.headersCondition.hashCode() +
515+
this.consumesCondition.hashCode() + this.producesCondition.hashCode() +
516+
this.customConditionHolder.hashCode();
503517
}
504518

505519
@Override

0 commit comments

Comments
 (0)