Browse Source

DefaultListableBeanFactory skips resolvableDependencies check for null value

Issue: SPR-13599
pull/900/head
Juergen Hoeller 10 years ago
parent
commit
5386e8a9e9
  1. 2
      spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
  2. 53
      spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java

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

@ -1225,7 +1225,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto @@ -1225,7 +1225,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
for (Map.Entry<String, Object> entry : candidateBeans.entrySet()) {
String candidateBeanName = entry.getKey();
Object beanInstance = entry.getValue();
if (this.resolvableDependencies.values().contains(beanInstance) ||
if ((beanInstance != null && this.resolvableDependencies.containsValue(beanInstance)) ||
matchesBeanName(candidateBeanName, descriptor.getDependencyName())) {
return candidateBeanName;
}

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

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -556,6 +556,38 @@ public class AutowiredAnnotationBeanPostProcessorTests { @@ -556,6 +556,38 @@ public class AutowiredAnnotationBeanPostProcessorTests {
assertSame(bf, bean.getBeanFactory());
}
@Test
public void testConstructorResourceInjectionWithNull() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.registerResolvableDependency(BeanFactory.class, bf);
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
bpp.setBeanFactory(bf);
bf.addBeanPostProcessor(bpp);
RootBeanDefinition bd = new RootBeanDefinition(ConstructorResourceInjectionBean.class);
bd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE);
bf.registerBeanDefinition("annotatedBean", bd);
TestBean tb = new TestBean();
bf.registerSingleton("testBean", tb);
bf.registerBeanDefinition("nestedTestBean", new RootBeanDefinition(NullNestedTestBeanFactoryBean.class));
bf.registerSingleton("nestedTestBean2", new NestedTestBean());
ConstructorResourceInjectionBean bean = (ConstructorResourceInjectionBean) bf.getBean("annotatedBean");
assertSame(tb, bean.getTestBean());
assertSame(tb, bean.getTestBean2());
assertSame(tb, bean.getTestBean3());
assertSame(tb, bean.getTestBean4());
assertNull(bean.getNestedTestBean());
assertSame(bf, bean.getBeanFactory());
bean = (ConstructorResourceInjectionBean) bf.getBean("annotatedBean");
assertSame(tb, bean.getTestBean());
assertSame(tb, bean.getTestBean2());
assertSame(tb, bean.getTestBean3());
assertSame(tb, bean.getTestBean4());
assertNull(bean.getNestedTestBean());
assertSame(bf, bean.getBeanFactory());
}
@Test
public void testConstructorResourceInjectionWithMultipleCandidates() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
@ -2869,4 +2901,23 @@ public class AutowiredAnnotationBeanPostProcessorTests { @@ -2869,4 +2901,23 @@ public class AutowiredAnnotationBeanPostProcessorTests {
}
}
public static class NullNestedTestBeanFactoryBean implements FactoryBean<NestedTestBean> {
@Override
public NestedTestBean getObject() {
return null;
}
@Override
public Class<?> getObjectType() {
return NestedTestBean.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
}

Loading…
Cancel
Save