diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/type/classreading/ConcurrentReferenceCachingMetadataReaderFactory.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/type/classreading/ConcurrentReferenceCachingMetadataReaderFactory.java index 48ac8c176f..d8e9976219 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/type/classreading/ConcurrentReferenceCachingMetadataReaderFactory.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/type/classreading/ConcurrentReferenceCachingMetadataReaderFactory.java @@ -38,7 +38,9 @@ import org.springframework.util.ConcurrentReferenceHashMap; */ public class ConcurrentReferenceCachingMetadataReaderFactory extends SimpleMetadataReaderFactory { - private final Map cache = new ConcurrentReferenceHashMap<>(); + private final Map classNameCache = new ConcurrentReferenceHashMap<>(); + + private final Map resourceCache = new ConcurrentReferenceHashMap<>(); /** * Create a new {@link ConcurrentReferenceCachingMetadataReaderFactory} instance for @@ -66,12 +68,22 @@ public class ConcurrentReferenceCachingMetadataReaderFactory extends SimpleMetad super(classLoader); } + @Override + public MetadataReader getMetadataReader(String className) throws IOException { + MetadataReader metadataReader = this.classNameCache.get(className); + if (metadataReader == null) { + metadataReader = super.getMetadataReader(className); + this.classNameCache.put(className, metadataReader); + } + return metadataReader; + } + @Override public MetadataReader getMetadataReader(Resource resource) throws IOException { - MetadataReader metadataReader = this.cache.get(resource); + MetadataReader metadataReader = this.resourceCache.get(resource); if (metadataReader == null) { metadataReader = createMetadataReader(resource); - this.cache.put(resource, metadataReader); + this.resourceCache.put(resource, metadataReader); } return metadataReader; } @@ -90,7 +102,8 @@ public class ConcurrentReferenceCachingMetadataReaderFactory extends SimpleMetad * Clear the entire MetadataReader cache, removing all cached class metadata. */ public void clearCache() { - this.cache.clear(); + this.classNameCache.clear(); + this.resourceCache.clear(); } }