Skip to content

Commit 6e5711a

Browse files
committed
Revised test for ImportBeanDefinitionRegistrar double scan
Issue: SPR-12334
1 parent 15c8987 commit 6e5711a

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

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

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.springframework.core.type.classreading.MetadataReader;
6767
import org.springframework.core.type.classreading.MetadataReaderFactory;
6868
import org.springframework.core.type.filter.AssignableTypeFilter;
69+
import org.springframework.util.Assert;
6970
import org.springframework.util.LinkedMultiValueMap;
7071
import org.springframework.util.MultiValueMap;
7172
import org.springframework.util.StringUtils;
@@ -315,9 +316,7 @@ private void processPropertySource(AnnotationAttributes propertySource) throws I
315316
String name = propertySource.getString("name");
316317
String[] locations = propertySource.getStringArray("value");
317318
boolean ignoreResourceNotFound = propertySource.getBoolean("ignoreResourceNotFound");
318-
if (locations.length == 0) {
319-
throw new IllegalArgumentException("At least one @PropertySource(value) location is required");
320-
}
319+
Assert.isTrue(locations.length > 0, "At least one @PropertySource(value) location is required");
321320
for (String location : locations) {
322321
try {
323322
String resolvedLocation = this.environment.resolveRequiredPlaceholders(location);
@@ -401,6 +400,7 @@ private void processImports(ConfigurationClass configClass, SourceClass currentS
401400
if (importCandidates.isEmpty()) {
402401
return;
403402
}
403+
404404
if (checkForCircularImports && this.importStack.contains(configClass)) {
405405
this.problemReporter.error(new CircularImportProblem(configClass, this.importStack, configClass.getMetadata()));
406406
}
@@ -409,12 +409,13 @@ private void processImports(ConfigurationClass configClass, SourceClass currentS
409409
try {
410410
for (SourceClass candidate : importCandidates) {
411411
if (candidate.isAssignable(ImportSelector.class)) {
412-
// the candidate class is an ImportSelector -> delegate to it to determine imports
412+
// Candidate class is an ImportSelector -> delegate to it to determine imports
413413
Class<?> candidateClass = candidate.loadClass();
414414
ImportSelector selector = BeanUtils.instantiateClass(candidateClass, ImportSelector.class);
415415
invokeAwareMethods(selector);
416416
if (selector instanceof DeferredImportSelector) {
417-
this.deferredImportSelectors.add(new DeferredImportSelectorHolder(configClass, (DeferredImportSelector) selector));
417+
this.deferredImportSelectors.add(
418+
new DeferredImportSelectorHolder(configClass, (DeferredImportSelector) selector));
418419
}
419420
else {
420421
String[] importClassNames = selector.selectImports(currentSourceClass.getMetadata());
@@ -423,15 +424,19 @@ private void processImports(ConfigurationClass configClass, SourceClass currentS
423424
}
424425
}
425426
else if (candidate.isAssignable(ImportBeanDefinitionRegistrar.class)) {
426-
// the candidate class is an ImportBeanDefinitionRegistrar -> delegate to it to register additional bean definitions
427+
// Candidate class is an ImportBeanDefinitionRegistrar ->
428+
// delegate to it to register additional bean definitions
427429
Class<?> candidateClass = candidate.loadClass();
428-
ImportBeanDefinitionRegistrar registrar = BeanUtils.instantiateClass(candidateClass, ImportBeanDefinitionRegistrar.class);
430+
ImportBeanDefinitionRegistrar registrar =
431+
BeanUtils.instantiateClass(candidateClass, ImportBeanDefinitionRegistrar.class);
429432
invokeAwareMethods(registrar);
430433
configClass.addImportBeanDefinitionRegistrar(registrar, currentSourceClass.getMetadata());
431434
}
432435
else {
433-
// candidate class not an ImportSelector or ImportBeanDefinitionRegistrar -> process it as a @Configuration class
434-
this.importStack.registerImport(currentSourceClass.getMetadata(), candidate.getMetadata().getClassName());
436+
// Candidate class not an ImportSelector or ImportBeanDefinitionRegistrar ->
437+
// process it as a @Configuration class
438+
this.importStack.registerImport(
439+
currentSourceClass.getMetadata(), candidate.getMetadata().getClassName());
435440
processConfigurationClass(candidate.asConfigClass(configClass));
436441
}
437442
}
@@ -645,12 +650,12 @@ public DeferredImportSelector getImportSelector() {
645650

646651

647652
/**
648-
* Simple wrapper that allows annotated source classes to be dealt with in a uniform
649-
* manor, regardless of how they are loaded.
653+
* Simple wrapper that allows annotated source classes to be dealt with
654+
* in a uniform manner, regardless of how they are loaded.
650655
*/
651656
private class SourceClass {
652657

653-
private final Object source; // Class or MetaDataReader
658+
private final Object source; // Class or MetadataReader
654659

655660
private final AnnotationMetadata metadata;
656661

spring-context/src/test/java/org/springframework/context/annotation/spr12334/Spr12334Tests.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public class Spr12334Tests {
3333

3434
@Test
3535
public void shouldNotScanTwice() {
36+
TestImport.scanned = false;
37+
3638
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
3739
context.scan(TestImport.class.getPackage().getName());
3840
context.refresh();
@@ -53,14 +55,14 @@ public static class TestConfiguration {
5355

5456
public static class TestImport implements ImportBeanDefinitionRegistrar {
5557

56-
private boolean scanned = false;
58+
private static boolean scanned = false;
5759

5860
@Override
5961
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
60-
if (this.scanned) {
62+
if (scanned) {
6163
throw new IllegalStateException("Already scanned");
6264
}
63-
this.scanned = true;
65+
scanned = true;
6466
}
6567
}
6668

0 commit comments

Comments
 (0)