From 1b53edfc5e17f30730f0d24ac1a019b85be1e675 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 19 Feb 2016 00:05:28 +0100 Subject: [PATCH] DefaultListableBeanFactory skips fallback match attempt for Collection/Map beans Issue: SPR-13963 --- .../support/DefaultListableBeanFactory.java | 2 +- ...wiredAnnotationBeanPostProcessorTests.java | 44 +++++++++++++------ 2 files changed, 32 insertions(+), 14 deletions(-) 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 8092399f4a..3bfcf4a9d9 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 @@ -1199,7 +1199,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto result.put(candidateName, getBean(candidateName)); } } - if (result.isEmpty()) { + if (result.isEmpty() && !Collection.class.isAssignableFrom(requiredType) && !Map.class.isAssignableFrom(requiredType)) { // Consider fallback matches if the first pass failed to find anything... DependencyDescriptor fallbackDescriptor = descriptor.forFallbackMatch(); for (String candidateName : candidateNames) { 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 e1f3c7ddb7..9ce9eabb81 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 @@ -25,6 +25,7 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -910,16 +911,15 @@ public class AutowiredAnnotationBeanPostProcessorTests { RootBeanDefinition bd = new RootBeanDefinition(MapConstructorInjectionBean.class); bd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE); bf.registerBeanDefinition("annotatedBean", bd); - Map tbm = new LinkedHashMap(); - tbm.put("testBean1", new TestBean("tb1")); - tbm.put("testBean2", new TestBean("tb2")); - bf.registerSingleton("testBeans", tbm); - bf.registerSingleton("otherMap", new Properties()); + RootBeanDefinition tbm = new RootBeanDefinition(CollectionFactoryMethods.class); + tbm.setUniqueFactoryMethodName("testBeanMap"); + bf.registerBeanDefinition("myTestBeanMap", tbm); + bf.registerSingleton("otherMap", new HashMap()); MapConstructorInjectionBean bean = (MapConstructorInjectionBean) bf.getBean("annotatedBean"); - assertSame(tbm, bean.getTestBeanMap()); + assertSame(bf.getBean("myTestBeanMap"), bean.getTestBeanMap()); bean = (MapConstructorInjectionBean) bf.getBean("annotatedBean"); - assertSame(tbm, bean.getTestBeanMap()); + assertSame(bf.getBean("myTestBeanMap"), bean.getTestBeanMap()); } @Test @@ -954,16 +954,15 @@ public class AutowiredAnnotationBeanPostProcessorTests { RootBeanDefinition bd = new RootBeanDefinition(SetConstructorInjectionBean.class); bd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE); bf.registerBeanDefinition("annotatedBean", bd); - Set tbs = new LinkedHashSet(); - tbs.add(new TestBean("tb1")); - tbs.add(new TestBean("tb2")); - bf.registerSingleton("testBeanSet", tbs); + RootBeanDefinition tbs = new RootBeanDefinition(CollectionFactoryMethods.class); + tbs.setUniqueFactoryMethodName("testBeanSet"); + bf.registerBeanDefinition("myTestBeanSet", tbs); bf.registerSingleton("otherSet", new HashSet()); SetConstructorInjectionBean bean = (SetConstructorInjectionBean) bf.getBean("annotatedBean"); - assertSame(tbs, bean.getTestBeanSet()); + assertSame(bf.getBean("myTestBeanSet"), bean.getTestBeanSet()); bean = (SetConstructorInjectionBean) bf.getBean("annotatedBean"); - assertSame(tbs, bean.getTestBeanSet()); + assertSame(bf.getBean("myTestBeanSet"), bean.getTestBeanSet()); } @Test @@ -3203,4 +3202,23 @@ public class AutowiredAnnotationBeanPostProcessorTests { } } + + public static class CollectionFactoryMethods { + + public static Map testBeanMap() { + Map tbm = new LinkedHashMap(); + tbm.put("testBean1", new TestBean("tb1")); + tbm.put("testBean2", new TestBean("tb2")); + return tbm; + } + + public static Set testBeanSet() { + Set tbs = new LinkedHashSet(); + tbs.add(new TestBean("tb1")); + tbs.add(new TestBean("tb2")); + return tbs; + } + + } + }