Skip abstract beans in getBeansWithAnnotation()
Update BeanFactory.getBeansWithAnnotation() to skip any abstract bean definitions. Issue: SPR-10663
This commit is contained in:
parent
a403e8f8b8
commit
8ed8ee2dfe
|
|
@ -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
|
||||||
|
|
||||||
@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));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?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;
|
||||||
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 {
|
||||||
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 {
|
||||||
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 {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@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 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract static class AbstractFactoryBean implements FactoryBean<Object> {
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue