Create MetadataReaderFactory instances with factory methods

Prior to this commit, Spring would create directly
`SimpleMetadataReaderFactory` instances or would manually create
`CachingMetadataReaderFactory` which extend
`SimpleMetadataReaderFactory`. This would prevent usage of the new
`ClassFileMetadataReaderFactory` in our internal codebase.

This commit replaces manual instantiations with calls to
`MetadataReaderFactory` factory methods and makes
`CachingMetadataReaderFactory` delegate to another factory created with
the same factory methods.

This allows internal usage of `ClassFileMetadataReaderFactory`
internally.

Closes gh-33616
This commit is contained in:
Brian Clozel 2024-11-28 16:27:35 +01:00
parent 4f260a4511
commit 5d492689b7
2 changed files with 15 additions and 11 deletions

View File

@ -83,7 +83,6 @@ import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.MethodMetadata;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;
import org.springframework.javapoet.ClassName;
import org.springframework.javapoet.CodeBlock;
import org.springframework.lang.Nullable;
@ -284,7 +283,7 @@ public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationA
"AutowiredAnnotationBeanPostProcessor requires a ConfigurableListableBeanFactory: " + beanFactory);
}
this.beanFactory = clbf;
this.metadataReaderFactory = new SimpleMetadataReaderFactory(clbf.getBeanClassLoader());
this.metadataReaderFactory = MetadataReaderFactory.create(clbf.getBeanClassLoader());
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -35,11 +35,13 @@ import org.springframework.lang.Nullable;
* @author Costin Leau
* @since 2.5
*/
public class CachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
public class CachingMetadataReaderFactory implements MetadataReaderFactory {
/** Default maximum number of entries for a local MetadataReader cache: 256. */
public static final int DEFAULT_CACHE_LIMIT = 256;
private final MetadataReaderFactory delegate;
/** MetadataReader cache: either local or shared at the ResourceLoader level. */
@Nullable
private Map<Resource, MetadataReader> metadataReaderCache;
@ -50,7 +52,7 @@ public class CachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
* using a local resource cache.
*/
public CachingMetadataReaderFactory() {
super();
this.delegate = MetadataReaderFactory.create((ClassLoader) null);
setCacheLimit(DEFAULT_CACHE_LIMIT);
}
@ -60,7 +62,7 @@ public class CachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
* @param classLoader the ClassLoader to use
*/
public CachingMetadataReaderFactory(@Nullable ClassLoader classLoader) {
super(classLoader);
this.delegate = MetadataReaderFactory.create(classLoader);
setCacheLimit(DEFAULT_CACHE_LIMIT);
}
@ -72,7 +74,7 @@ public class CachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
* @see DefaultResourceLoader#getResourceCache
*/
public CachingMetadataReaderFactory(@Nullable ResourceLoader resourceLoader) {
super(resourceLoader);
this.delegate = MetadataReaderFactory.create(resourceLoader);
if (resourceLoader instanceof DefaultResourceLoader defaultResourceLoader) {
this.metadataReaderCache = defaultResourceLoader.getResourceCache(MetadataReader.class);
}
@ -81,7 +83,6 @@ public class CachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
}
}
/**
* Specify the maximum number of entries for the MetadataReader cache.
* <p>Default is 256 for a local cache, whereas a shared cache is
@ -112,6 +113,10 @@ public class CachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
}
}
@Override
public MetadataReader getMetadataReader(String className) throws IOException {
return this.delegate.getMetadataReader(className);
}
@Override
public MetadataReader getMetadataReader(Resource resource) throws IOException {
@ -119,7 +124,7 @@ public class CachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
// No synchronization necessary...
MetadataReader metadataReader = this.metadataReaderCache.get(resource);
if (metadataReader == null) {
metadataReader = super.getMetadataReader(resource);
metadataReader = this.delegate.getMetadataReader(resource);
this.metadataReaderCache.put(resource, metadataReader);
}
return metadataReader;
@ -128,14 +133,14 @@ public class CachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
synchronized (this.metadataReaderCache) {
MetadataReader metadataReader = this.metadataReaderCache.get(resource);
if (metadataReader == null) {
metadataReader = super.getMetadataReader(resource);
metadataReader = this.delegate.getMetadataReader(resource);
this.metadataReaderCache.put(resource, metadataReader);
}
return metadataReader;
}
}
else {
return super.getMetadataReader(resource);
return this.delegate.getMetadataReader(resource);
}
}