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:
parent
4f260a4511
commit
5d492689b7
|
@ -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());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue