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.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<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>();
 | 
			
		||||
		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));
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.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<Object> {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -152,6 +168,7 @@ public final class FactoryBeanTests {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	@Component
 | 
			
		||||
	public static class BetaFactoryBean implements FactoryBean<Object> {
 | 
			
		||||
 | 
			
		||||
		private Beta beta;
 | 
			
		||||
| 
						 | 
				
			
			@ -176,4 +193,7 @@ public final class FactoryBeanTests {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public abstract static class AbstractFactoryBean implements FactoryBean<Object> {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue