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 fb36471778..a584a0ddcf 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 @@ -76,6 +76,7 @@ import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.lang.Nullable; +import org.springframework.stereotype.Component; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -261,8 +262,10 @@ class ConfigurationClassParser { protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) throws IOException { - // Recursively process any member (nested) classes first - processMemberClasses(configClass, sourceClass); + if (sourceClass.getMetadata().isAnnotated(Component.class.getName())) { + // Recursively process any member (nested) classes first + processMemberClasses(configClass, sourceClass); + } // Process any @PropertySource annotations for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable( diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java index ec2f58e30a..5ada7b5b8f 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java @@ -119,7 +119,7 @@ abstract class ConfigurationClassUtils { beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE); } else { - return hasNestedConfigurationClass(metadata, metadataReaderFactory); + return false; } // It's a full or lite configuration candidate... Let's determine the order value, if any. @@ -131,40 +131,6 @@ abstract class ConfigurationClassUtils { return true; } - /** - * Check whether the specified class declares a nested configuration class. - */ - private static boolean hasNestedConfigurationClass( - AnnotationMetadata metadata, MetadataReaderFactory metadataReaderFactory) { - - // Potentially nested configuration classes... - if (metadata instanceof StandardAnnotationMetadata) { - Class beanClass = ((StandardAnnotationMetadata) metadata).getIntrospectedClass(); - for (Class memberClass : beanClass.getDeclaredClasses()) { - if (isConfigurationCandidate(new StandardAnnotationMetadata(memberClass))) { - return true; - } - } - } - else { - for (String memberName : metadata.getMemberClassNames()) { - try { - MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(memberName); - if (isConfigurationCandidate(metadataReader.getAnnotationMetadata())) { - return true; - } - } - catch (IOException ex) { - if (logger.isDebugEnabled()) { - logger.debug("Could not find class file for introspecting configuration annotations: " + - memberName, ex); - } - } - } - } - return false; - } - /** * Check the given metadata for a configuration class candidate * (or nested component class declared within a configuration/component class). diff --git a/spring-context/src/test/java/org/springframework/context/annotation/ImportVersusDirectRegistrationTests.java b/spring-context/src/test/java/org/springframework/context/annotation/ImportVersusDirectRegistrationTests.java index 4b471e4d14..2be677cfe9 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/ImportVersusDirectRegistrationTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/ImportVersusDirectRegistrationTests.java @@ -18,6 +18,7 @@ package org.springframework.context.annotation; import org.junit.Test; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.support.RootBeanDefinition; /** @@ -25,8 +26,8 @@ import org.springframework.beans.factory.support.RootBeanDefinition; */ public class ImportVersusDirectRegistrationTests { - @Test - public void thingIsAvailableWhenOuterConfigurationIsRegisteredDirectly() { + @Test(expected = NoSuchBeanDefinitionException.class) + public void thingIsNotAvailableWhenOuterConfigurationIsRegisteredDirectly() { try (AnnotationConfigApplicationContext directRegistration = new AnnotationConfigApplicationContext()) { directRegistration.register(AccidentalLiteConfiguration.class); directRegistration.refresh(); @@ -34,8 +35,8 @@ public class ImportVersusDirectRegistrationTests { } } - @Test - public void thingIsAvailableWhenOuterConfigurationIsRegisteredWithClassName() { + @Test(expected = NoSuchBeanDefinitionException.class) + public void thingIsNotAvailableWhenOuterConfigurationIsRegisteredWithClassName() { try (AnnotationConfigApplicationContext directRegistration = new AnnotationConfigApplicationContext()) { directRegistration.registerBeanDefinition("config", new RootBeanDefinition(AccidentalLiteConfiguration.class.getName())); @@ -44,8 +45,8 @@ public class ImportVersusDirectRegistrationTests { } } - @Test - public void thingIsAvailableWhenOuterConfigurationIsImported() { + @Test(expected = NoSuchBeanDefinitionException.class) + public void thingIsNotAvailableWhenOuterConfigurationIsImported() { try (AnnotationConfigApplicationContext viaImport = new AnnotationConfigApplicationContext()) { viaImport.register(Importer.class); viaImport.refresh();