diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java index d8794a6b801..ebedd96f1b7 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java @@ -234,6 +234,9 @@ public class RootBeanDefinition extends AbstractBeanDefinition { this.isFactoryMethodUnique = true; } + /** + * Check whether the given candidate qualifies as a factory method. + */ public boolean isFactoryMethod(Method candidate) { return (candidate != null && candidate.getName().equals(getFactoryMethodName())); } diff --git a/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java b/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java index 3e6d28c1efb..bc0730e8419 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java +++ b/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java @@ -26,6 +26,7 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; @@ -36,6 +37,7 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.core.io.Resource; +import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.MethodMetadata; import org.springframework.util.StringUtils; @@ -110,10 +112,11 @@ class ConfigurationClassBeanDefinitionReader { * {@link #registry} based on its contents. */ private void loadBeanDefinitionsForModelMethod(ConfigurationClassMethod method) { + ConfigurationClass configClass = method.getDeclaringClass(); MethodMetadata metadata = method.getMetadata(); - RootBeanDefinition beanDef = new ConfigurationClassBeanDefinition(); - ConfigurationClass configClass = method.getDeclaringClass(); + RootBeanDefinition beanDef = new ConfigurationClassBeanDefinition(configClass); + beanDef.setResource(configClass.getResource()); beanDef.setSource(this.sourceExtractor.extractSource(metadata, configClass.getResource())); beanDef.setFactoryBeanName(configClass.getBeanName()); beanDef.setUniqueFactoryMethodName(metadata.getMethodName()); @@ -209,13 +212,21 @@ class ConfigurationClassBeanDefinitionReader { * Used in bean overriding cases where it's necessary to determine whether the bean * definition was created externally. */ - private class ConfigurationClassBeanDefinition extends RootBeanDefinition { + private class ConfigurationClassBeanDefinition extends RootBeanDefinition implements AnnotatedBeanDefinition { - public ConfigurationClassBeanDefinition() { + private AnnotationMetadata annotationMetadata; + + public ConfigurationClassBeanDefinition(ConfigurationClass configClass) { + this.annotationMetadata = configClass.getMetadata(); } private ConfigurationClassBeanDefinition(ConfigurationClassBeanDefinition original) { super(original); + this.annotationMetadata = original.annotationMetadata; + } + + public AnnotationMetadata getMetadata() { + return this.annotationMetadata; } @Override