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 29271d5b01..4aec20e2d4 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 @@ -1679,7 +1679,12 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto if (autowiredBeanNames != null) { autowiredBeanNames.add(dependencyName); } + boolean preExisting = containsSingleton(dependencyName); Object dependencyBean = getBean(dependencyName); + if (preExisting && dependencyBean instanceof NullBean) { + // for backwards compatibility with addCandidateEntry in the regular code path + dependencyBean = null; + } return resolveInstance(dependencyBean, descriptor, type, dependencyName); } } @@ -1760,7 +1765,6 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto throw new BeanNotOfRequiredTypeException(name, type, candidate.getClass()); } return result; - } @Nullable 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 fea47ae12c..dd7d68b190 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 @@ -960,11 +960,34 @@ class AutowiredAnnotationBeanPostProcessorTests { @Test void constructorResourceInjectionWithNoCandidatesAndNoFallback() { bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ConstructorWithoutFallbackBean.class)); + assertThatExceptionOfType(UnsatisfiedDependencyException.class) .isThrownBy(() -> bf.getBean("annotatedBean")) .satisfies(methodParameterDeclaredOn(ConstructorWithoutFallbackBean.class)); } + @Test + void constructorResourceInjectionWithCandidateAndNoFallback() { + bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ConstructorWithoutFallbackBean.class)); + RootBeanDefinition tb = new RootBeanDefinition(NullFactoryMethods.class); + tb.setFactoryMethodName("createTestBean"); + bf.registerBeanDefinition("testBean", tb); + + bf.getBean("testBean"); + assertThat(bf.getBean("annotatedBean", ConstructorWithoutFallbackBean.class).getTestBean3()).isNull(); + } + + @Test + void constructorResourceInjectionWithNameMatchingCandidateAndNoFallback() { + bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ConstructorWithoutFallbackBean.class)); + RootBeanDefinition tb = new RootBeanDefinition(NullFactoryMethods.class); + tb.setFactoryMethodName("createTestBean"); + bf.registerBeanDefinition("testBean3", tb); + + bf.getBean("testBean3"); + assertThat(bf.getBean("annotatedBean", ConstructorWithoutFallbackBean.class).getTestBean3()).isNull(); + } + @Test void constructorResourceInjectionWithSometimesNullBeanEarly() { RootBeanDefinition bd = new RootBeanDefinition(ConstructorWithNullableArgument.class); @@ -1193,6 +1216,7 @@ class AutowiredAnnotationBeanPostProcessorTests { @Test void singleConstructorInjectionWithMissingDependency() { bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(SingleConstructorOptionalCollectionBean.class)); + assertThatExceptionOfType(UnsatisfiedDependencyException.class) .isThrownBy(() -> bf.getBean("annotatedBean")); } @@ -1203,6 +1227,7 @@ class AutowiredAnnotationBeanPostProcessorTests { RootBeanDefinition tb = new RootBeanDefinition(NullFactoryMethods.class); tb.setFactoryMethodName("createTestBean"); bf.registerBeanDefinition("testBean", tb); + assertThatExceptionOfType(UnsatisfiedDependencyException.class) .isThrownBy(() -> bf.getBean("annotatedBean")); } @@ -3060,7 +3085,6 @@ class AutowiredAnnotationBeanPostProcessorTests { protected ITestBean testBean3; - @Autowired(required = false) public ConstructorWithoutFallbackBean(ITestBean testBean3) { this.testBean3 = testBean3; } @@ -3075,7 +3099,6 @@ class AutowiredAnnotationBeanPostProcessorTests { protected ITestBean testBean3; - @Autowired(required = false) public ConstructorWithNullableArgument(@Nullable ITestBean testBean3) { this.testBean3 = testBean3; }