From f3b50c9a58183c26530ed5066d7327731002965b Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 5 Mar 2025 22:44:09 +0100 Subject: [PATCH] Ignore null beans in SimpleAutowireCandidateResolver.resolveAutowireCandidates Closes gh-34543 --- .../factory/support/SimpleAutowireCandidateResolver.java | 6 +++++- .../AutowiredAnnotationBeanPostProcessorTests.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleAutowireCandidateResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleAutowireCandidateResolver.java index b67fdb6e54..12041b3686 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleAutowireCandidateResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleAutowireCandidateResolver.java @@ -66,11 +66,15 @@ public class SimpleAutowireCandidateResolver implements AutowireCandidateResolve * @see org.springframework.beans.factory.config.BeanDefinition#isAutowireCandidate() * @see AbstractBeanDefinition#isDefaultCandidate() */ + @SuppressWarnings("unchecked") public static Map resolveAutowireCandidates(ConfigurableListableBeanFactory lbf, Class type) { Map candidates = new LinkedHashMap<>(); for (String beanName : BeanFactoryUtils.beanNamesForTypeIncludingAncestors(lbf, type)) { if (AutowireUtils.isAutowireCandidate(lbf, beanName)) { - candidates.put(beanName, lbf.getBean(beanName, type)); + Object beanInstance = lbf.getBean(beanName); + if (!(beanInstance instanceof NullBean)) { + candidates.put(beanName, (T) beanInstance); + } } } return candidates; 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 9c4283a529..f53f9ff5a4 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 @@ -1770,6 +1770,10 @@ class AutowiredAnnotationBeanPostProcessorTests { parent.registerBeanDefinition("testBean4", tb4); bf.setParentBeanFactory(parent); + RootBeanDefinition tb5 = new RootBeanDefinition(NullFactoryMethods.class); + tb5.setFactoryMethodName("createTestBean"); + bf.registerBeanDefinition("testBean5", tb5); + ObjectProviderInjectionBean bean = bf.getBean("annotatedBean", ObjectProviderInjectionBean.class); assertThat(bean.streamTestBeans()).containsExactly(bf.getBean("testBean1", TestBean.class), bf.getBean("testBean2", TestBean.class)); @@ -1789,7 +1793,7 @@ class AutowiredAnnotationBeanPostProcessorTests { Map typeMatches = BeanFactoryUtils.beansOfTypeIncludingAncestors(bf, TestBean.class); assertThat(typeMatches.remove("testBean3")).isNotNull(); Map candidates = SimpleAutowireCandidateResolver.resolveAutowireCandidates(bf, TestBean.class); - assertThat(candidates).containsExactlyEntriesOf(candidates); + assertThat(candidates).containsExactlyEntriesOf(typeMatches); } @Test