diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/RuntimeBeanReference.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/RuntimeBeanReference.java index d1198405a0..17cd3a9e01 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/RuntimeBeanReference.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/RuntimeBeanReference.java @@ -107,6 +107,7 @@ public class RuntimeBeanReference implements BeanReference { * @since 7.0 */ public RuntimeBeanReference(String beanName, Class beanType, boolean toParent) { + Assert.hasText(beanName, "'beanName' must not be empty"); Assert.notNull(beanType, "'beanType' must not be null"); this.beanName = beanName; this.beanType = beanType; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionValueResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionValueResolver.java index 26f1976f8f..6df80c586e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionValueResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionValueResolver.java @@ -333,6 +333,7 @@ public class BeanDefinitionValueResolver { try { Object bean; Class beanType = ref.getBeanType(); + String resolvedName = String.valueOf(doEvaluate(ref.getBeanName())); if (ref.isToParent()) { BeanFactory parent = this.beanFactory.getParentBeanFactory(); if (parent == null) { @@ -342,21 +343,25 @@ public class BeanDefinitionValueResolver { " in parent factory: no parent factory available"); } if (beanType != null) { - bean = parent.getBean(beanType); + bean = (parent.containsBean(resolvedName) ? + parent.getBean(resolvedName, beanType) : parent.getBean(beanType)); } else { - bean = parent.getBean(String.valueOf(doEvaluate(ref.getBeanName()))); + bean = parent.getBean(resolvedName); } } else { - String resolvedName; if (beanType != null) { - NamedBeanHolder namedBean = this.beanFactory.resolveNamedBean(beanType); - bean = namedBean.getBeanInstance(); - resolvedName = namedBean.getBeanName(); + if (this.beanFactory.containsBean(resolvedName)) { + bean = this.beanFactory.getBean(resolvedName, beanType); + } + else { + NamedBeanHolder namedBean = this.beanFactory.resolveNamedBean(beanType); + bean = namedBean.getBeanInstance(); + resolvedName = namedBean.getBeanName(); + } } else { - resolvedName = String.valueOf(doEvaluate(ref.getBeanName())); bean = this.beanFactory.getBean(resolvedName); } this.beanFactory.registerDependentBean(resolvedName, this.beanName); diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/BeanFactoryUtilsTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/BeanFactoryUtilsTests.java index bf17cfe774..aedbc48741 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/BeanFactoryUtilsTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/BeanFactoryUtilsTests.java @@ -555,21 +555,33 @@ class BeanFactoryUtilsTests { } @Test - void supportsMultipleTypesWithProperty() { + void supportsMultipleTypesWithPropertyAndSingleBean() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); SupportsTypeSmartFactoryBean sfb = new SupportsTypeSmartFactoryBean(); lbf.registerSingleton("sfb", sfb); - RootBeanDefinition rbd1 = new RootBeanDefinition(PropertyRecipient.class); - rbd1.getPropertyValues().add("sfb", new RuntimeBeanReference(ITestBean.class)); - lbf.registerBeanDefinition("recipient1", rbd1); + RootBeanDefinition rbd = new RootBeanDefinition(PropertyRecipient.class); + rbd.getPropertyValues().add("sfb", new RuntimeBeanReference(ITestBean.class)); + lbf.registerBeanDefinition("recipient", rbd); - RootBeanDefinition rbd2 = new RootBeanDefinition(PropertyRecipient.class); - rbd2.getPropertyValues().add("sfb", new RuntimeBeanReference("sfb", ITestBean.class)); - lbf.registerBeanDefinition("recipient2", rbd2); + assertThat(lbf.getBean("recipient", PropertyRecipient.class).sfb) + .isSameAs(lbf.getBean("sfb", ITestBean.class)); + } - assertThat(lbf.getBean("recipient1", PropertyRecipient.class).sfb).isSameAs(lbf.getBean("sfb", ITestBean.class)); - assertThat(lbf.getBean("recipient2", PropertyRecipient.class).sfb).isSameAs(lbf.getBean("sfb", ITestBean.class)); + @Test + void supportsMultipleTypesWithPropertyAndMultipleBeans() { + DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); + SupportsTypeSmartFactoryBean sfb = new SupportsTypeSmartFactoryBean(); + lbf.registerSingleton("sfb", sfb); + SupportsTypeSmartFactoryBean other = new SupportsTypeSmartFactoryBean(); + lbf.registerSingleton("other", other); + + RootBeanDefinition rbd = new RootBeanDefinition(PropertyRecipient.class); + rbd.getPropertyValues().add("sfb", new RuntimeBeanReference("sfb", ITestBean.class)); + lbf.registerBeanDefinition("recipient", rbd); + + assertThat(lbf.getBean("recipient", PropertyRecipient.class).sfb) + .isSameAs(lbf.getBean("sfb", ITestBean.class)); }