Browse Source

ConfigurationClassPostProcessor skips pre-processed bean definitions now (avoiding side effects in case of multiple CCPPs)

Issue: SPR-11858
(cherry picked from commit b625512)
pull/579/head
Juergen Hoeller 12 years ago
parent
commit
7b38b41bf5
  1. 10
      spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java
  2. 8
      spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java
  3. 3
      spring-context/src/test/java/org/springframework/context/annotation/configuration/ImportXmlConfig-context.xml

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

@ -271,7 +271,13 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo @@ -271,7 +271,13 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
Set<BeanDefinitionHolder> configCandidates = new LinkedHashSet<BeanDefinitionHolder>();
for (String beanName : registry.getBeanDefinitionNames()) {
BeanDefinition beanDef = registry.getBeanDefinition(beanName);
if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
if (ConfigurationClassUtils.isFullConfigurationClass(beanDef) ||
ConfigurationClassUtils.isLiteConfigurationClass(beanDef)) {
if (logger.isDebugEnabled()) {
logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);
}
}
else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
}
}
@ -443,6 +449,6 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo @@ -443,6 +449,6 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
}
return pvs;
}
}
}

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

@ -139,4 +139,12 @@ abstract class ConfigurationClassUtils { @@ -139,4 +139,12 @@ abstract class ConfigurationClassUtils {
return CONFIGURATION_CLASS_FULL.equals(beanDef.getAttribute(CONFIGURATION_CLASS_ATTRIBUTE));
}
/**
* Determine whether the given bean definition indicates a lite {@code @Configuration}
* class, through checking {@link #checkConfigurationClassCandidate}'s metadata marker.
*/
public static boolean isLiteConfigurationClass(BeanDefinition beanDef) {
return CONFIGURATION_CLASS_LITE.equals(beanDef.getAttribute(CONFIGURATION_CLASS_ATTRIBUTE));
}
}

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

@ -15,4 +15,7 @@ @@ -15,4 +15,7 @@
</property>
</bean>
<!-- should not cause infinite loop (SPR-11858) but rather simply be ignored -->
<bean class="org.springframework.context.annotation.ConfigurationClassPostProcessor"/>
</beans>

Loading…
Cancel
Save