next cut of JavaConfig metadata reading revision: using cached MetadataReaders
This commit is contained in:
@@ -33,7 +33,7 @@ import org.springframework.core.io.ResourceLoader;
|
||||
*/
|
||||
public class CachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
|
||||
|
||||
private final Map<Resource, MetadataReader> classReaderCache = new HashMap<Resource, MetadataReader>();
|
||||
private final Map<Resource, SimpleMetadataReader> classReaderCache = new HashMap<Resource, SimpleMetadataReader>();
|
||||
|
||||
|
||||
/**
|
||||
@@ -62,9 +62,9 @@ public class CachingMetadataReaderFactory extends SimpleMetadataReaderFactory {
|
||||
|
||||
|
||||
@Override
|
||||
public MetadataReader getMetadataReader(Resource resource) throws IOException {
|
||||
public SimpleMetadataReader getMetadataReader(Resource resource) throws IOException {
|
||||
synchronized (this.classReaderCache) {
|
||||
MetadataReader metadataReader = this.classReaderCache.get(resource);
|
||||
SimpleMetadataReader metadataReader = this.classReaderCache.get(resource);
|
||||
if (metadataReader == null) {
|
||||
metadataReader = super.getMetadataReader(resource);
|
||||
this.classReaderCache.put(resource, metadataReader);
|
||||
|
||||
@@ -30,29 +30,55 @@ import org.springframework.core.type.ClassMetadata;
|
||||
* @author Juergen Hoeller
|
||||
* @since 2.5
|
||||
*/
|
||||
class SimpleMetadataReader implements MetadataReader {
|
||||
public class SimpleMetadataReader implements MetadataReader {
|
||||
|
||||
private final ClassReader classReader;
|
||||
|
||||
private final ClassLoader classLoader;
|
||||
|
||||
private ClassMetadata classMetadata;
|
||||
|
||||
public SimpleMetadataReader(ClassReader classReader, ClassLoader classLoader) {
|
||||
private AnnotationMetadata annotationMetadata;
|
||||
|
||||
|
||||
SimpleMetadataReader(ClassReader classReader, ClassLoader classLoader) {
|
||||
this.classReader = classReader;
|
||||
this.classLoader = classLoader;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the underlying ASM ClassReader.
|
||||
*/
|
||||
public final ClassReader getClassReader() {
|
||||
return this.classReader;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the underlying ClassLoader.
|
||||
*/
|
||||
public final ClassLoader getClassLoader() {
|
||||
return this.classLoader;
|
||||
}
|
||||
|
||||
|
||||
public ClassMetadata getClassMetadata() {
|
||||
ClassMetadataReadingVisitor visitor = new ClassMetadataReadingVisitor();
|
||||
this.classReader.accept(visitor, true);
|
||||
return visitor;
|
||||
if (this.classMetadata == null) {
|
||||
ClassMetadataReadingVisitor visitor = new ClassMetadataReadingVisitor();
|
||||
this.classReader.accept(visitor, true);
|
||||
this.classMetadata = visitor;
|
||||
}
|
||||
return this.classMetadata;
|
||||
}
|
||||
|
||||
public AnnotationMetadata getAnnotationMetadata() {
|
||||
AnnotationMetadataReadingVisitor visitor = new AnnotationMetadataReadingVisitor(this.classLoader);
|
||||
this.classReader.accept(visitor, true);
|
||||
return visitor;
|
||||
if (this.annotationMetadata == null) {
|
||||
AnnotationMetadataReadingVisitor visitor = new AnnotationMetadataReadingVisitor(this.classLoader);
|
||||
this.classReader.accept(visitor, true);
|
||||
this.annotationMetadata = visitor;
|
||||
this.classMetadata = visitor;
|
||||
}
|
||||
return this.annotationMetadata;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -63,13 +63,22 @@ public class SimpleMetadataReaderFactory implements MetadataReaderFactory {
|
||||
}
|
||||
|
||||
|
||||
public MetadataReader getMetadataReader(String className) throws IOException {
|
||||
/**
|
||||
* Return the ResourceLoader that this MetadataReaderFactory has been
|
||||
* constructed with.
|
||||
*/
|
||||
public final ResourceLoader getResourceLoader() {
|
||||
return this.resourceLoader;
|
||||
}
|
||||
|
||||
|
||||
public SimpleMetadataReader getMetadataReader(String className) throws IOException {
|
||||
String resourcePath = ResourceLoader.CLASSPATH_URL_PREFIX +
|
||||
ClassUtils.convertClassNameToResourcePath(className) + ClassUtils.CLASS_FILE_SUFFIX;
|
||||
return getMetadataReader(this.resourceLoader.getResource(resourcePath));
|
||||
}
|
||||
|
||||
public MetadataReader getMetadataReader(Resource resource) throws IOException {
|
||||
public SimpleMetadataReader getMetadataReader(Resource resource) throws IOException {
|
||||
InputStream is = resource.getInputStream();
|
||||
try {
|
||||
return new SimpleMetadataReader(new ClassReader(is), this.resourceLoader.getClassLoader());
|
||||
|
||||
Reference in New Issue
Block a user