Skip to content

Commit 9890872

Browse files
committed
Improve performance of ConcurrentReferenceCachingMetadataReaderFactory
Update `ConcurrentReferenceCachingMetadataReaderFactory` with cache by class name. Closes gh-42949
1 parent 7eb98b4 commit 9890872

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/type/classreading/ConcurrentReferenceCachingMetadataReaderFactory.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@
3838
*/
3939
public class ConcurrentReferenceCachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
4040

41-
private final Map<Resource, MetadataReader> cache = new ConcurrentReferenceHashMap<>();
41+
private final Map<String, MetadataReader> classNameCache = new ConcurrentReferenceHashMap<>();
42+
43+
private final Map<Resource, MetadataReader> resourceCache = new ConcurrentReferenceHashMap<>();
4244

4345
/**
4446
* Create a new {@link ConcurrentReferenceCachingMetadataReaderFactory} instance for
@@ -66,12 +68,22 @@ public ConcurrentReferenceCachingMetadataReaderFactory(ClassLoader classLoader)
6668
super(classLoader);
6769
}
6870

71+
@Override
72+
public MetadataReader getMetadataReader(String className) throws IOException {
73+
MetadataReader metadataReader = this.classNameCache.get(className);
74+
if (metadataReader == null) {
75+
metadataReader = super.getMetadataReader(className);
76+
this.classNameCache.put(className, metadataReader);
77+
}
78+
return metadataReader;
79+
}
80+
6981
@Override
7082
public MetadataReader getMetadataReader(Resource resource) throws IOException {
71-
MetadataReader metadataReader = this.cache.get(resource);
83+
MetadataReader metadataReader = this.resourceCache.get(resource);
7284
if (metadataReader == null) {
7385
metadataReader = createMetadataReader(resource);
74-
this.cache.put(resource, metadataReader);
86+
this.resourceCache.put(resource, metadataReader);
7587
}
7688
return metadataReader;
7789
}
@@ -90,7 +102,8 @@ protected MetadataReader createMetadataReader(Resource resource) throws IOExcept
90102
* Clear the entire MetadataReader cache, removing all cached class metadata.
91103
*/
92104
public void clearCache() {
93-
this.cache.clear();
105+
this.classNameCache.clear();
106+
this.resourceCache.clear();
94107
}
95108

96109
}

0 commit comments

Comments
 (0)