next cut of JavaConfig metadata reading revision: using cached MetadataReaders

This commit is contained in:
Juergen Hoeller
2009-04-22 10:46:24 +00:00
parent 4c42597cbc
commit ea9d8925a2
17 changed files with 345 additions and 292 deletions

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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());