Skip to content

Commit 8ed8ee2

Browse files
committed
Skip abstract beans in getBeansWithAnnotation()
Update BeanFactory.getBeansWithAnnotation() to skip any abstract bean definitions. Issue: SPR-10663
1 parent a403e8f commit 8ed8ee2

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import java.util.Collection;
3232
import java.util.HashMap;
3333
import java.util.LinkedHashMap;
34-
import java.util.LinkedHashSet;
3534
import java.util.List;
3635
import java.util.Map;
3736
import java.util.Set;
@@ -469,11 +468,14 @@ public <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingle
469468

470469
@Override
471470
public Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) {
472-
Set<String> beanNames = new LinkedHashSet<String>(getBeanDefinitionCount());
473-
beanNames.addAll(Arrays.asList(getBeanDefinitionNames()));
474-
beanNames.addAll(Arrays.asList(getSingletonNames()));
475471
Map<String, Object> results = new LinkedHashMap<String, Object>();
476-
for (String beanName : beanNames) {
472+
for (String beanName : getBeanDefinitionNames()) {
473+
BeanDefinition beanDefinition = getBeanDefinition(beanName);
474+
if (!beanDefinition.isAbstract() && (findAnnotationOnBean(beanName, annotationType) != null)) {
475+
results.put(beanName, getBean(beanName));
476+
}
477+
}
478+
for (String beanName : getSingletonNames()) {
477479
if (findAnnotationOnBean(beanName, annotationType) != null) {
478480
results.put(beanName, getBean(beanName));
479481
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
3+
4+
<beans>
5+
6+
<bean id="abstractFactoryBean" class="org.springframework.beans.factory.FactoryBeanTests$AbstractFactoryBean" abstract="true"/>
7+
8+
</beans>

spring-beans/src/test/java/org/springframework/beans/factory/FactoryBeanTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
2727
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
2828
import org.springframework.core.io.Resource;
29+
import org.springframework.stereotype.Component;
2930
import org.springframework.util.Assert;
3031

3132
/**
@@ -38,6 +39,7 @@ public final class FactoryBeanTests {
3839
private static final Class<?> CLASS = FactoryBeanTests.class;
3940
private static final Resource RETURNS_NULL_CONTEXT = qualifiedResource(CLASS, "returnsNull.xml");
4041
private static final Resource WITH_AUTOWIRING_CONTEXT = qualifiedResource(CLASS, "withAutowiring.xml");
42+
private static final Resource ABSTRACT_CONTEXT = qualifiedResource(CLASS, "abstract.xml");
4143

4244
@Test
4345
public void testFactoryBeanReturnsNull() throws Exception {
@@ -80,6 +82,20 @@ public void testFactoryBeansWithIntermediateFactoryBeanAutowiringFailure() throw
8082
assertSame(gamma, beta.getGamma());
8183
}
8284

85+
@Test
86+
public void testAbstractFactoryBeanViaAnnotation() throws Exception {
87+
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
88+
new XmlBeanDefinitionReader(factory).loadBeanDefinitions(ABSTRACT_CONTEXT);
89+
factory.getBeansWithAnnotation(Component.class);
90+
}
91+
92+
@Test
93+
public void testAbstractFactoryBeanViaType() throws Exception {
94+
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
95+
new XmlBeanDefinitionReader(factory).loadBeanDefinitions(ABSTRACT_CONTEXT);
96+
factory.getBeansOfType(AbstractFactoryBean.class);
97+
}
98+
8399

84100
public static class NullReturningFactoryBean implements FactoryBean<Object> {
85101

@@ -152,6 +168,7 @@ public static class Gamma {
152168
}
153169

154170

171+
@Component
155172
public static class BetaFactoryBean implements FactoryBean<Object> {
156173

157174
private Beta beta;
@@ -176,4 +193,7 @@ public boolean isSingleton() {
176193
}
177194
}
178195

196+
public abstract static class AbstractFactoryBean implements FactoryBean<Object> {
197+
}
198+
179199
}

0 commit comments

Comments
 (0)