diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java index f7a50cb0032..6e87ae230f1 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java @@ -1225,7 +1225,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto for (Map.Entry 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; } diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java index 68b24b20ee6..b6cb43db004 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java @@ -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 { 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 { } } + + public static class NullNestedTestBeanFactoryBean implements FactoryBean { + + @Override + public NestedTestBean getObject() { + return null; + } + + @Override + public Class getObjectType() { + return NestedTestBean.class; + } + + @Override + public boolean isSingleton() { + return true; + } + } + }