Skip to content

Commit 3f06a92

Browse files
committed
getBean(Class<?>) now filters out bean definitions for which isAutowireCandidate() is false (SPR-7120)
1 parent 5057c4a commit 3f06a92

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,17 @@ public void copyConfigurationFrom(ConfigurableBeanFactory otherFactory) {
248248
public <T> T getBean(Class<T> requiredType) throws BeansException {
249249
Assert.notNull(requiredType, "Required type must not be null");
250250
String[] beanNames = getBeanNamesForType(requiredType);
251+
if (beanNames.length > 1) {
252+
ArrayList<String> autowireCandidates = new ArrayList<String>();
253+
for (String beanName : beanNames) {
254+
if (getBeanDefinition(beanName).isAutowireCandidate()) {
255+
autowireCandidates.add(beanName);
256+
}
257+
}
258+
if (autowireCandidates.size() > 0) {
259+
beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]);
260+
}
261+
}
251262
if (beanNames.length == 1) {
252263
return getBean(beanNames[0], requiredType);
253264
}

org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,38 @@ public void testAutowireBeanByNameWithNoDependencyCheck() {
12181218
assertNull(bean.getSpouse());
12191219
}
12201220

1221+
@Test(expected=NoSuchBeanDefinitionException.class)
1222+
public void testGetBeanByTypeWithAmbiguity() {
1223+
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
1224+
RootBeanDefinition bd1 = new RootBeanDefinition(TestBean.class);
1225+
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
1226+
lbf.registerBeanDefinition("bd1", bd1);
1227+
lbf.registerBeanDefinition("bd2", bd2);
1228+
lbf.getBean(TestBean.class);
1229+
}
1230+
1231+
@Test
1232+
public void testGetBeanByTypeFiltersOutNonAutowireCandidates() {
1233+
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
1234+
RootBeanDefinition bd1 = new RootBeanDefinition(TestBean.class);
1235+
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
1236+
RootBeanDefinition na1 = new RootBeanDefinition(TestBean.class);
1237+
na1.setAutowireCandidate(false);
1238+
1239+
lbf.registerBeanDefinition("bd1", bd1);
1240+
lbf.registerBeanDefinition("na1", na1);
1241+
TestBean actual = lbf.getBean(TestBean.class); // na1 was filtered
1242+
assertSame(lbf.getBean("bd1", TestBean.class), actual);
1243+
1244+
lbf.registerBeanDefinition("bd2", bd2);
1245+
try {
1246+
lbf.getBean(TestBean.class);
1247+
fail("Should have thrown NoSuchBeanDefinitionException");
1248+
} catch (NoSuchBeanDefinitionException ex) {
1249+
// expected
1250+
}
1251+
}
1252+
12211253
@Test
12221254
public void testAutowireBeanByType() {
12231255
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();

0 commit comments

Comments
 (0)