Skip to content

Commit c1b772c

Browse files
committed
Optimized ImportAware processing to avoid re-reading class files
(cherry picked from commit 519f78c)
1 parent 73a8a1b commit c1b772c

File tree

2 files changed

+14
-26
lines changed

2 files changed

+14
-26
lines changed

spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ else if (checkAssignability(ImportBeanDefinitionRegistrar.class, candidateToChec
397397
}
398398
else {
399399
// candidate class not an ImportSelector or ImportBeanDefinitionRegistrar -> process it as a @Configuration class
400-
this.importStack.registerImport(importingClassMetadata.getClassName(),
400+
this.importStack.registerImport(importingClassMetadata,
401401
(candidate instanceof Class ? ((Class) candidate).getName() : (String) candidate));
402402
processConfigurationClass(candidateToCheck instanceof Class ? new ConfigurationClass((Class) candidateToCheck, true) :
403403
new ConfigurationClass((MetadataReader) candidateToCheck, true));
@@ -469,20 +469,20 @@ ImportRegistry getImportRegistry() {
469469

470470
interface ImportRegistry {
471471

472-
String getImportingClassFor(String importedClass);
472+
AnnotationMetadata getImportingClassFor(String importedClass);
473473
}
474474

475475

476476
@SuppressWarnings("serial")
477477
private static class ImportStack extends Stack<ConfigurationClass> implements ImportRegistry {
478478

479-
private final Map<String, String> imports = new HashMap<String, String>();
479+
private final Map<String, AnnotationMetadata> imports = new HashMap<String, AnnotationMetadata>();
480480

481-
public void registerImport(String importingClass, String importedClass) {
481+
public void registerImport(AnnotationMetadata importingClass, String importedClass) {
482482
this.imports.put(importedClass, importingClass);
483483
}
484484

485-
public String getImportingClassFor(String importedClass) {
485+
public AnnotationMetadata getImportingClassFor(String importedClass) {
486486
return this.imports.get(importedClass);
487487
}
488488

spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
import org.springframework.core.type.AnnotationMetadata;
6161
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
6262
import org.springframework.core.type.classreading.MetadataReaderFactory;
63-
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;
6463
import org.springframework.util.Assert;
6564
import org.springframework.util.ClassUtils;
6665

@@ -236,8 +235,8 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
236235
throw new IllegalStateException(
237236
"postProcessBeanFactory already called for this post-processor against " + beanFactory);
238237
}
239-
this.factoriesPostProcessed.add((factoryId));
240-
if (!this.registriesPostProcessed.contains((factoryId))) {
238+
this.factoriesPostProcessed.add(factoryId);
239+
if (!this.registriesPostProcessed.contains(factoryId)) {
241240
// BeanDefinitionRegistryPostProcessor hook apparently not supported...
242241
// Simply call processConfigurationClasses lazily at this point then.
243242
processConfigBeanDefinitions((BeanDefinitionRegistry) beanFactory);
@@ -372,36 +371,25 @@ public void enhanceConfigurationClasses(ConfigurableListableBeanFactory beanFact
372371
}
373372

374373

375-
private static class ImportAwareBeanPostProcessor implements BeanPostProcessor, PriorityOrdered, BeanFactoryAware {
374+
private static class ImportAwareBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware, PriorityOrdered {
376375

377376
private BeanFactory beanFactory;
378377

378+
public void setBeanFactory(BeanFactory beanFactory) {
379+
this.beanFactory = beanFactory;
380+
}
381+
379382
public int getOrder() {
380383
return Ordered.HIGHEST_PRECEDENCE;
381384
}
382385

383386
@Override
384-
public void setBeanFactory(BeanFactory beanFactory) {
385-
this.beanFactory = beanFactory;
386-
}
387-
388387
public Object postProcessBeforeInitialization(Object bean, String beanName) {
389388
if (bean instanceof ImportAware) {
390389
ImportRegistry importRegistry = this.beanFactory.getBean(IMPORT_REGISTRY_BEAN_NAME, ImportRegistry.class);
391-
String importingClass = importRegistry.getImportingClassFor(bean.getClass().getSuperclass().getName());
390+
AnnotationMetadata importingClass = importRegistry.getImportingClassFor(bean.getClass().getSuperclass().getName());
392391
if (importingClass != null) {
393-
try {
394-
AnnotationMetadata metadata =
395-
new SimpleMetadataReaderFactory().getMetadataReader(importingClass).getAnnotationMetadata();
396-
((ImportAware) bean).setImportMetadata(metadata);
397-
}
398-
catch (IOException ex) {
399-
// should never occur -> at this point we know the class is present anyway
400-
throw new IllegalStateException(ex);
401-
}
402-
}
403-
else {
404-
// no importing class was found
392+
((ImportAware) bean).setImportMetadata(importingClass);
405393
}
406394
}
407395
return bean;

0 commit comments

Comments
 (0)