Browse Source

Avoid computeIfAbsent for createMappings which calls back into same map

Closes gh-35944
pull/35968/head
Juergen Hoeller 2 weeks ago
parent
commit
667851c0fa
  1. 11
      spring-core/src/main/java/org/springframework/core/annotation/AnnotationTypeMappings.java

11
spring-core/src/main/java/org/springframework/core/annotation/AnnotationTypeMappings.java

@ -78,6 +78,7 @@ final class AnnotationTypeMappings { @@ -78,6 +78,7 @@ final class AnnotationTypeMappings {
private void addAllMappings(Class<? extends Annotation> annotationType,
Set<Class<? extends Annotation>> visitedAnnotationTypes) {
Deque<AnnotationTypeMapping> queue = new ArrayDeque<>();
addIfPossible(queue, null, annotationType, null, false, visitedAnnotationTypes);
while (!queue.isEmpty()) {
@ -273,11 +274,19 @@ final class AnnotationTypeMappings { @@ -273,11 +274,19 @@ final class AnnotationTypeMappings {
*/
AnnotationTypeMappings get(Class<? extends Annotation> annotationType,
Set<Class<? extends Annotation>> visitedAnnotationTypes) {
return this.mappings.computeIfAbsent(annotationType, key -> createMappings(key, visitedAnnotationTypes));
AnnotationTypeMappings result = this.mappings.get(annotationType);
if (result != null) {
return result;
}
result = createMappings(annotationType, visitedAnnotationTypes);
AnnotationTypeMappings existing = this.mappings.putIfAbsent(annotationType, result);
return (existing != null ? existing : result);
}
private AnnotationTypeMappings createMappings(Class<? extends Annotation> annotationType,
Set<Class<? extends Annotation>> visitedAnnotationTypes) {
return new AnnotationTypeMappings(this.repeatableContainers, this.filter, annotationType,
visitedAnnotationTypes);
}

Loading…
Cancel
Save