Skip to content

Commit 5386e8a

Browse files
committed
DefaultListableBeanFactory skips resolvableDependencies check for null value
Issue: SPR-13599
1 parent 8c4b8d2 commit 5386e8a

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1225,7 +1225,7 @@ protected String determineAutowireCandidate(Map<String, Object> candidateBeans,
12251225
for (Map.Entry<String, Object> entry : candidateBeans.entrySet()) {
12261226
String candidateBeanName = entry.getKey();
12271227
Object beanInstance = entry.getValue();
1228-
if (this.resolvableDependencies.values().contains(beanInstance) ||
1228+
if ((beanInstance != null && this.resolvableDependencies.containsValue(beanInstance)) ||
12291229
matchesBeanName(candidateBeanName, descriptor.getDependencyName())) {
12301230
return candidateBeanName;
12311231
}

spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2014 the original author or authors.
2+
* Copyright 2002-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -556,6 +556,38 @@ public void testConstructorResourceInjection() {
556556
assertSame(bf, bean.getBeanFactory());
557557
}
558558

559+
@Test
560+
public void testConstructorResourceInjectionWithNull() {
561+
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
562+
bf.registerResolvableDependency(BeanFactory.class, bf);
563+
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
564+
bpp.setBeanFactory(bf);
565+
bf.addBeanPostProcessor(bpp);
566+
RootBeanDefinition bd = new RootBeanDefinition(ConstructorResourceInjectionBean.class);
567+
bd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE);
568+
bf.registerBeanDefinition("annotatedBean", bd);
569+
TestBean tb = new TestBean();
570+
bf.registerSingleton("testBean", tb);
571+
bf.registerBeanDefinition("nestedTestBean", new RootBeanDefinition(NullNestedTestBeanFactoryBean.class));
572+
bf.registerSingleton("nestedTestBean2", new NestedTestBean());
573+
574+
ConstructorResourceInjectionBean bean = (ConstructorResourceInjectionBean) bf.getBean("annotatedBean");
575+
assertSame(tb, bean.getTestBean());
576+
assertSame(tb, bean.getTestBean2());
577+
assertSame(tb, bean.getTestBean3());
578+
assertSame(tb, bean.getTestBean4());
579+
assertNull(bean.getNestedTestBean());
580+
assertSame(bf, bean.getBeanFactory());
581+
582+
bean = (ConstructorResourceInjectionBean) bf.getBean("annotatedBean");
583+
assertSame(tb, bean.getTestBean());
584+
assertSame(tb, bean.getTestBean2());
585+
assertSame(tb, bean.getTestBean3());
586+
assertSame(tb, bean.getTestBean4());
587+
assertNull(bean.getNestedTestBean());
588+
assertSame(bf, bean.getBeanFactory());
589+
}
590+
559591
@Test
560592
public void testConstructorResourceInjectionWithMultipleCandidates() {
561593
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
@@ -2869,4 +2901,23 @@ public void setObj(MyCallable obj) {
28692901
}
28702902
}
28712903

2904+
2905+
public static class NullNestedTestBeanFactoryBean implements FactoryBean<NestedTestBean> {
2906+
2907+
@Override
2908+
public NestedTestBean getObject() {
2909+
return null;
2910+
}
2911+
2912+
@Override
2913+
public Class<?> getObjectType() {
2914+
return NestedTestBean.class;
2915+
}
2916+
2917+
@Override
2918+
public boolean isSingleton() {
2919+
return true;
2920+
}
2921+
}
2922+
28722923
}

0 commit comments

Comments
 (0)