diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java index 9feecbc4ed..70b0063704 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java @@ -248,6 +248,17 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto public T getBean(Class requiredType) throws BeansException { Assert.notNull(requiredType, "Required type must not be null"); String[] beanNames = getBeanNamesForType(requiredType); + if (beanNames.length > 1) { + ArrayList autowireCandidates = new ArrayList(); + for (String beanName : beanNames) { + if (getBeanDefinition(beanName).isAutowireCandidate()) { + autowireCandidates.add(beanName); + } + } + if (autowireCandidates.size() > 0) { + beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]); + } + } if (beanNames.length == 1) { return getBean(beanNames[0], requiredType); } diff --git a/org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java b/org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java index ab1b364740..7869e74a25 100644 --- a/org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java +++ b/org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java @@ -1218,6 +1218,38 @@ public final class DefaultListableBeanFactoryTests { assertNull(bean.getSpouse()); } + @Test(expected=NoSuchBeanDefinitionException.class) + public void testGetBeanByTypeWithAmbiguity() { + DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); + RootBeanDefinition bd1 = new RootBeanDefinition(TestBean.class); + RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class); + lbf.registerBeanDefinition("bd1", bd1); + lbf.registerBeanDefinition("bd2", bd2); + lbf.getBean(TestBean.class); + } + + @Test + public void testGetBeanByTypeFiltersOutNonAutowireCandidates() { + DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); + RootBeanDefinition bd1 = new RootBeanDefinition(TestBean.class); + RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class); + RootBeanDefinition na1 = new RootBeanDefinition(TestBean.class); + na1.setAutowireCandidate(false); + + lbf.registerBeanDefinition("bd1", bd1); + lbf.registerBeanDefinition("na1", na1); + TestBean actual = lbf.getBean(TestBean.class); // na1 was filtered + assertSame(lbf.getBean("bd1", TestBean.class), actual); + + lbf.registerBeanDefinition("bd2", bd2); + try { + lbf.getBean(TestBean.class); + fail("Should have thrown NoSuchBeanDefinitionException"); + } catch (NoSuchBeanDefinitionException ex) { + // expected + } + } + @Test public void testAutowireBeanByType() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();