diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java index 840e4b816fc7534440a851707e3d7808353d5306..7bcc5caba10ea38537bdebebc4e4c965e9676384 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java @@ -31,7 +31,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -469,11 +468,14 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto @Override public Map getBeansWithAnnotation(Class annotationType) { - Set beanNames = new LinkedHashSet(getBeanDefinitionCount()); - beanNames.addAll(Arrays.asList(getBeanDefinitionNames())); - beanNames.addAll(Arrays.asList(getSingletonNames())); Map results = new LinkedHashMap(); - for (String beanName : beanNames) { + for (String beanName : getBeanDefinitionNames()) { + BeanDefinition beanDefinition = getBeanDefinition(beanName); + if (!beanDefinition.isAbstract() && (findAnnotationOnBean(beanName, annotationType) != null)) { + results.put(beanName, getBean(beanName)); + } + } + for (String beanName : getSingletonNames()) { if (findAnnotationOnBean(beanName, annotationType) != null) { results.put(beanName, getBean(beanName)); } diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/FactoryBeanTests-abstract.xml b/spring-beans/src/test/java/org/springframework/beans/factory/FactoryBeanTests-abstract.xml new file mode 100644 index 0000000000000000000000000000000000000000..e82ccdc59bcd4bf0158a5ff6167cea36a4bf2e6d --- /dev/null +++ b/spring-beans/src/test/java/org/springframework/beans/factory/FactoryBeanTests-abstract.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/FactoryBeanTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/FactoryBeanTests.java index 62c85b60b2bc741da17051bd15e0abf39d85bc14..5d7808f426b19b3b5a6756e5e68c8780036e4c25 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/FactoryBeanTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/FactoryBeanTests.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; import org.springframework.util.Assert; /** @@ -38,6 +39,7 @@ public final class FactoryBeanTests { private static final Class CLASS = FactoryBeanTests.class; private static final Resource RETURNS_NULL_CONTEXT = qualifiedResource(CLASS, "returnsNull.xml"); private static final Resource WITH_AUTOWIRING_CONTEXT = qualifiedResource(CLASS, "withAutowiring.xml"); + private static final Resource ABSTRACT_CONTEXT = qualifiedResource(CLASS, "abstract.xml"); @Test public void testFactoryBeanReturnsNull() throws Exception { @@ -80,6 +82,20 @@ public final class FactoryBeanTests { assertSame(gamma, beta.getGamma()); } + @Test + public void testAbstractFactoryBeanViaAnnotation() throws Exception { + DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); + new XmlBeanDefinitionReader(factory).loadBeanDefinitions(ABSTRACT_CONTEXT); + factory.getBeansWithAnnotation(Component.class); + } + + @Test + public void testAbstractFactoryBeanViaType() throws Exception { + DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); + new XmlBeanDefinitionReader(factory).loadBeanDefinitions(ABSTRACT_CONTEXT); + factory.getBeansOfType(AbstractFactoryBean.class); + } + public static class NullReturningFactoryBean implements FactoryBean { @@ -152,6 +168,7 @@ public final class FactoryBeanTests { } + @Component public static class BetaFactoryBean implements FactoryBean { private Beta beta; @@ -176,4 +193,7 @@ public final class FactoryBeanTests { } } + public abstract static class AbstractFactoryBean implements FactoryBean { + } + }