提交 8ed8ee2d 编写于 作者: P Phillip Webb

Skip abstract beans in getBeansWithAnnotation()

Update BeanFactory.getBeansWithAnnotation() to skip any abstract
bean definitions.

Issue: SPR-10663
上级 a403e8f8
...@@ -31,7 +31,6 @@ import java.util.Arrays; ...@@ -31,7 +31,6 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
...@@ -469,11 +468,14 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto ...@@ -469,11 +468,14 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
@Override @Override
public Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) { public Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) {
Set<String> beanNames = new LinkedHashSet<String>(getBeanDefinitionCount());
beanNames.addAll(Arrays.asList(getBeanDefinitionNames()));
beanNames.addAll(Arrays.asList(getSingletonNames()));
Map<String, Object> results = new LinkedHashMap<String, Object>(); Map<String, Object> results = new LinkedHashMap<String, Object>();
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) { if (findAnnotationOnBean(beanName, annotationType) != null) {
results.put(beanName, getBean(beanName)); results.put(beanName, getBean(beanName));
} }
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="abstractFactoryBean" class="org.springframework.beans.factory.FactoryBeanTests$AbstractFactoryBean" abstract="true"/>
</beans>
...@@ -26,6 +26,7 @@ import org.springframework.beans.factory.config.BeanFactoryPostProcessor; ...@@ -26,6 +26,7 @@ import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
...@@ -38,6 +39,7 @@ public final class FactoryBeanTests { ...@@ -38,6 +39,7 @@ public final class FactoryBeanTests {
private static final Class<?> CLASS = FactoryBeanTests.class; private static final Class<?> CLASS = FactoryBeanTests.class;
private static final Resource RETURNS_NULL_CONTEXT = qualifiedResource(CLASS, "returnsNull.xml"); 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 WITH_AUTOWIRING_CONTEXT = qualifiedResource(CLASS, "withAutowiring.xml");
private static final Resource ABSTRACT_CONTEXT = qualifiedResource(CLASS, "abstract.xml");
@Test @Test
public void testFactoryBeanReturnsNull() throws Exception { public void testFactoryBeanReturnsNull() throws Exception {
...@@ -80,6 +82,20 @@ public final class FactoryBeanTests { ...@@ -80,6 +82,20 @@ public final class FactoryBeanTests {
assertSame(gamma, beta.getGamma()); 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<Object> { public static class NullReturningFactoryBean implements FactoryBean<Object> {
...@@ -152,6 +168,7 @@ public final class FactoryBeanTests { ...@@ -152,6 +168,7 @@ public final class FactoryBeanTests {
} }
@Component
public static class BetaFactoryBean implements FactoryBean<Object> { public static class BetaFactoryBean implements FactoryBean<Object> {
private Beta beta; private Beta beta;
...@@ -176,4 +193,7 @@ public final class FactoryBeanTests { ...@@ -176,4 +193,7 @@ public final class FactoryBeanTests {
} }
} }
public abstract static class AbstractFactoryBean implements FactoryBean<Object> {
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册