Skip to content

Commit b625512

Browse files
committed
ConfigurationClassPostProcessor skips pre-processed bean definitions now (avoiding side effects in case of multiple CCPPs)
Issue: SPR-11858
1 parent d239016 commit b625512

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,13 @@ public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
271271
Set<BeanDefinitionHolder> configCandidates = new LinkedHashSet<BeanDefinitionHolder>();
272272
for (String beanName : registry.getBeanDefinitionNames()) {
273273
BeanDefinition beanDef = registry.getBeanDefinition(beanName);
274-
if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
274+
if (ConfigurationClassUtils.isFullConfigurationClass(beanDef) ||
275+
ConfigurationClassUtils.isLiteConfigurationClass(beanDef)) {
276+
if (logger.isDebugEnabled()) {
277+
logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);
278+
}
279+
}
280+
else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
275281
configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
276282
}
277283
}
@@ -443,6 +449,6 @@ public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDesc
443449
}
444450
return pvs;
445451
}
446-
447452
}
453+
448454
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,4 +158,12 @@ public static boolean isFullConfigurationClass(BeanDefinition beanDef) {
158158
return CONFIGURATION_CLASS_FULL.equals(beanDef.getAttribute(CONFIGURATION_CLASS_ATTRIBUTE));
159159
}
160160

161+
/**
162+
* Determine whether the given bean definition indicates a lite {@code @Configuration}
163+
* class, through checking {@link #checkConfigurationClassCandidate}'s metadata marker.
164+
*/
165+
public static boolean isLiteConfigurationClass(BeanDefinition beanDef) {
166+
return CONFIGURATION_CLASS_LITE.equals(beanDef.getAttribute(CONFIGURATION_CLASS_ATTRIBUTE));
167+
}
168+
161169
}

spring-context/src/test/java/org/springframework/context/annotation/configuration/ImportXmlConfig-context.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,7 @@
1515
</property>
1616
</bean>
1717

18+
<!-- should not cause infinite loop (SPR-11858) but rather simply be ignored -->
19+
<bean class="org.springframework.context.annotation.ConfigurationClassPostProcessor"/>
20+
1821
</beans>

0 commit comments

Comments
 (0)