Optimized ImportAware processing to avoid re-reading class files

This commit is contained in:
Juergen Hoeller 2013-11-22 23:22:20 +01:00
parent 009e362709
commit 519f78c3f5
2 changed files with 13 additions and 27 deletions

View File

@ -424,8 +424,7 @@ class ConfigurationClassParser {
} }
else { else {
// candidate class not an ImportSelector or ImportBeanDefinitionRegistrar -> process it as a @Configuration class // candidate class not an ImportSelector or ImportBeanDefinitionRegistrar -> process it as a @Configuration class
this.importStack.registerImport(importingClassMetadata.getClassName(), this.importStack.registerImport(importingClassMetadata, candidate.getMetadata().getClassName());
candidate.getMetadata().getClassName());
processConfigurationClass(candidate.asConfigClass(configClass)); processConfigurationClass(candidate.asConfigClass(configClass));
} }
} }
@ -558,7 +557,7 @@ class ConfigurationClassParser {
interface ImportRegistry { interface ImportRegistry {
String getImportingClassFor(String importedClass); AnnotationMetadata getImportingClassFor(String importedClass);
} }
@ -566,14 +565,14 @@ class ConfigurationClassParser {
@SuppressWarnings("serial") @SuppressWarnings("serial")
private static class ImportStack extends Stack<ConfigurationClass> implements ImportRegistry { private static class ImportStack extends Stack<ConfigurationClass> implements ImportRegistry {
private final Map<String, String> imports = new HashMap<String, String>(); private final Map<String, AnnotationMetadata> imports = new HashMap<String, AnnotationMetadata>();
public void registerImport(String importingClass, String importedClass) { public void registerImport(AnnotationMetadata importingClass, String importedClass) {
this.imports.put(importedClass, importingClass); this.imports.put(importedClass, importingClass);
} }
@Override @Override
public String getImportingClassFor(String importedClass) { public AnnotationMetadata getImportingClassFor(String importedClass) {
return this.imports.get(importedClass); return this.imports.get(importedClass);
} }

View File

@ -17,7 +17,6 @@
package org.springframework.context.annotation; package org.springframework.context.annotation;
import java.beans.PropertyDescriptor; import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
@ -65,7 +64,6 @@ import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
@ -379,38 +377,27 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
} }
private static class ImportAwareBeanPostProcessor implements BeanPostProcessor, PriorityOrdered, BeanFactoryAware { private static class ImportAwareBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware, PriorityOrdered {
private BeanFactory beanFactory; private BeanFactory beanFactory;
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override @Override
public void setBeanFactory(BeanFactory beanFactory) { public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory; this.beanFactory = beanFactory;
} }
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) { public Object postProcessBeforeInitialization(Object bean, String beanName) {
if (bean instanceof ImportAware) { if (bean instanceof ImportAware) {
ImportRegistry importRegistry = this.beanFactory.getBean(IMPORT_REGISTRY_BEAN_NAME, ImportRegistry.class); ImportRegistry importRegistry = this.beanFactory.getBean(IMPORT_REGISTRY_BEAN_NAME, ImportRegistry.class);
String importingClass = importRegistry.getImportingClassFor(bean.getClass().getSuperclass().getName()); AnnotationMetadata importingClass = importRegistry.getImportingClassFor(bean.getClass().getSuperclass().getName());
if (importingClass != null) { if (importingClass != null) {
try { ((ImportAware) bean).setImportMetadata(importingClass);
AnnotationMetadata metadata =
new SimpleMetadataReaderFactory().getMetadataReader(importingClass).getAnnotationMetadata();
((ImportAware) bean).setImportMetadata(metadata);
}
catch (IOException ex) {
// should never occur -> at this point we know the class is present anyway
throw new IllegalStateException(ex);
}
}
else {
// no importing class was found
} }
} }
return bean; return bean;