Skip to content

Commit b83bc39

Browse files
committed
Restrict nested configuration class introspection to component types
Issue: SPR-16839
1 parent 45936f0 commit b83bc39

File tree

3 files changed

+13
-43
lines changed

3 files changed

+13
-43
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
import org.springframework.core.type.classreading.MetadataReaderFactory;
7777
import org.springframework.core.type.filter.AssignableTypeFilter;
7878
import org.springframework.lang.Nullable;
79+
import org.springframework.stereotype.Component;
7980
import org.springframework.util.Assert;
8081
import org.springframework.util.ClassUtils;
8182
import org.springframework.util.CollectionUtils;
@@ -261,8 +262,10 @@ protected void processConfigurationClass(ConfigurationClass configClass) throws
261262
protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)
262263
throws IOException {
263264

264-
// Recursively process any member (nested) classes first
265-
processMemberClasses(configClass, sourceClass);
265+
if (sourceClass.getMetadata().isAnnotated(Component.class.getName())) {
266+
// Recursively process any member (nested) classes first
267+
processMemberClasses(configClass, sourceClass);
268+
}
266269

267270
// Process any @PropertySource annotations
268271
for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable(

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

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ else if (isLiteConfigurationCandidate(metadata)) {
119119
beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE);
120120
}
121121
else {
122-
return hasNestedConfigurationClass(metadata, metadataReaderFactory);
122+
return false;
123123
}
124124

125125
// It's a full or lite configuration candidate... Let's determine the order value, if any.
@@ -131,40 +131,6 @@ else if (isLiteConfigurationCandidate(metadata)) {
131131
return true;
132132
}
133133

134-
/**
135-
* Check whether the specified class declares a nested configuration class.
136-
*/
137-
private static boolean hasNestedConfigurationClass(
138-
AnnotationMetadata metadata, MetadataReaderFactory metadataReaderFactory) {
139-
140-
// Potentially nested configuration classes...
141-
if (metadata instanceof StandardAnnotationMetadata) {
142-
Class<?> beanClass = ((StandardAnnotationMetadata) metadata).getIntrospectedClass();
143-
for (Class<?> memberClass : beanClass.getDeclaredClasses()) {
144-
if (isConfigurationCandidate(new StandardAnnotationMetadata(memberClass))) {
145-
return true;
146-
}
147-
}
148-
}
149-
else {
150-
for (String memberName : metadata.getMemberClassNames()) {
151-
try {
152-
MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(memberName);
153-
if (isConfigurationCandidate(metadataReader.getAnnotationMetadata())) {
154-
return true;
155-
}
156-
}
157-
catch (IOException ex) {
158-
if (logger.isDebugEnabled()) {
159-
logger.debug("Could not find class file for introspecting configuration annotations: " +
160-
memberName, ex);
161-
}
162-
}
163-
}
164-
}
165-
return false;
166-
}
167-
168134
/**
169135
* Check the given metadata for a configuration class candidate
170136
* (or nested component class declared within a configuration/component class).

spring-context/src/test/java/org/springframework/context/annotation/ImportVersusDirectRegistrationTests.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,25 @@
1818

1919
import org.junit.Test;
2020

21+
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2122
import org.springframework.beans.factory.support.RootBeanDefinition;
2223

2324
/**
2425
* @author Andy Wilkinson
2526
*/
2627
public class ImportVersusDirectRegistrationTests {
2728

28-
@Test
29-
public void thingIsAvailableWhenOuterConfigurationIsRegisteredDirectly() {
29+
@Test(expected = NoSuchBeanDefinitionException.class)
30+
public void thingIsNotAvailableWhenOuterConfigurationIsRegisteredDirectly() {
3031
try (AnnotationConfigApplicationContext directRegistration = new AnnotationConfigApplicationContext()) {
3132
directRegistration.register(AccidentalLiteConfiguration.class);
3233
directRegistration.refresh();
3334
directRegistration.getBean(Thing.class);
3435
}
3536
}
3637

37-
@Test
38-
public void thingIsAvailableWhenOuterConfigurationIsRegisteredWithClassName() {
38+
@Test(expected = NoSuchBeanDefinitionException.class)
39+
public void thingIsNotAvailableWhenOuterConfigurationIsRegisteredWithClassName() {
3940
try (AnnotationConfigApplicationContext directRegistration = new AnnotationConfigApplicationContext()) {
4041
directRegistration.registerBeanDefinition("config",
4142
new RootBeanDefinition(AccidentalLiteConfiguration.class.getName()));
@@ -44,8 +45,8 @@ public void thingIsAvailableWhenOuterConfigurationIsRegisteredWithClassName() {
4445
}
4546
}
4647

47-
@Test
48-
public void thingIsAvailableWhenOuterConfigurationIsImported() {
48+
@Test(expected = NoSuchBeanDefinitionException.class)
49+
public void thingIsNotAvailableWhenOuterConfigurationIsImported() {
4950
try (AnnotationConfigApplicationContext viaImport = new AnnotationConfigApplicationContext()) {
5051
viaImport.register(Importer.class);
5152
viaImport.refresh();

0 commit comments

Comments
 (0)