From d4b54d834e5c86ad65644158335c382842181ec8 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Fri, 21 Jun 2013 07:44:51 +0200 Subject: [PATCH] Skip abstract beans in getBeansWithAnnotation() Update BeanFactory.getBeansWithAnnotation() to skip any abstract bean definitions. Issue: SPR-10663 (cherry picked from commit 8ed8ee2) --- .../support/DefaultListableBeanFactory.java | 14 +++++++------ .../factory/FactoryBeanTests-abstract.xml | 8 ++++++++ .../beans/factory/FactoryBeanTests.java | 20 +++++++++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 spring-beans/src/test/java/org/springframework/beans/factory/FactoryBeanTests-abstract.xml 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 e88e04f4690..bc832ca7720 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; @@ -460,12 +459,15 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto } 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) { - if (findAnnotationOnBean(beanName, annotationType) != null) { + 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 (!results.containsKey(beanName) && 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 00000000000..e82ccdc59bc --- /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 62c85b60b2b..5d7808f426b 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 { + } + }