diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java index 38343c1647..7fd102e2a9 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java @@ -670,7 +670,10 @@ class ConfigurationClassParser { private Collection asSourceClasses(String[] classNames, Predicate filter) throws IOException { List annotatedClasses = new ArrayList<>(classNames.length); for (String className : classNames) { - annotatedClasses.add(asSourceClass(className, filter)); + SourceClass sourceClass = asSourceClass(className, filter); + if (this.objectSourceClass != sourceClass) { + annotatedClasses.add(sourceClass); + } } return annotatedClasses; } diff --git a/spring-context/src/test/java/org/springframework/context/annotation/ImportSelectorTests.java b/spring-context/src/test/java/org/springframework/context/annotation/ImportSelectorTests.java index e04987b3bf..6f2febdfa9 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/ImportSelectorTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/ImportSelectorTests.java @@ -91,6 +91,17 @@ public class ImportSelectorTests { ordered.verify(beanFactory).registerBeanDefinition(eq("c"), any()); } + @Test + void filteredImportSelector() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.register(FilteredConfig.class); + context.refresh(); + String[] beanNames = context.getBeanFactory().getBeanDefinitionNames(); + assertThat(beanNames).endsWith("importSelectorTests.FilteredConfig", + ImportedSelector2.class.getName(), "b"); + assertThat(beanNames).doesNotContain(Object.class.getName()); + } + @Test void invokeAwareMethodsInImportSelector() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AwareConfig.class); @@ -274,6 +285,25 @@ public class ImportSelectorTests { } } + @Configuration + @Import(FilteredImportSelector.class) + public static class FilteredConfig { + } + + public static class FilteredImportSelector implements ImportSelector { + + @Override + public String[] selectImports(AnnotationMetadata importingClassMetadata) { + return new String[] { ImportedSelector1.class.getName(), ImportedSelector2.class.getName(), ImportedSelector3.class.getName() }; + } + + @Override + public Predicate getExclusionFilter() { + return (className -> className.equals(ImportedSelector1.class.getName()) || + className.equals(ImportedSelector3.class.getName())); + } + } + public static class DeferredImportSelector1 implements DeferredImportSelector, Ordered { @@ -320,6 +350,15 @@ public class ImportSelectorTests { } } + @Configuration + public static class ImportedSelector3 { + + @Bean + public String c() { + return "c"; + } + } + @Configuration public static class DeferredImportedSelector1 {