From b6255128bf7a32384f03e985d79b8bb03c3dd8a0 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 25 Jun 2014 13:46:15 +0200 Subject: [PATCH] ConfigurationClassPostProcessor skips pre-processed bean definitions now (avoiding side effects in case of multiple CCPPs) Issue: SPR-11858 --- .../annotation/ConfigurationClassPostProcessor.java | 10 ++++++++-- .../context/annotation/ConfigurationClassUtils.java | 8 ++++++++ .../configuration/ImportXmlConfig-context.xml | 3 +++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java index fc19634732e..bb488888317 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java @@ -271,7 +271,13 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo Set configCandidates = new LinkedHashSet(); 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 } return pvs; } - } + } 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 33350cd90c9..bfa4c2bbd35 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 @@ -158,4 +158,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)); + } + } diff --git a/spring-context/src/test/java/org/springframework/context/annotation/configuration/ImportXmlConfig-context.xml b/spring-context/src/test/java/org/springframework/context/annotation/configuration/ImportXmlConfig-context.xml index 344716316fe..ad1694d437d 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/configuration/ImportXmlConfig-context.xml +++ b/spring-context/src/test/java/org/springframework/context/annotation/configuration/ImportXmlConfig-context.xml @@ -15,4 +15,7 @@ + + +