Skip to content

Commit 4b44a34

Browse files
committed
Complete treatment of RuntimeBeanReference in BeanDefinitionValueResolver
See gh-35101
1 parent f7fef93 commit 4b44a34

File tree

3 files changed

+34
-16
lines changed

3 files changed

+34
-16
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/config/RuntimeBeanReference.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ public RuntimeBeanReference(String beanName, Class<?> beanType) {
107107
* @since 7.0
108108
*/
109109
public RuntimeBeanReference(String beanName, Class<?> beanType, boolean toParent) {
110+
Assert.hasText(beanName, "'beanName' must not be empty");
110111
Assert.notNull(beanType, "'beanType' must not be null");
111112
this.beanName = beanName;
112113
this.beanType = beanType;

spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionValueResolver.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ else if (value instanceof String[] values) {
333333
try {
334334
Object bean;
335335
Class<?> beanType = ref.getBeanType();
336+
String resolvedName = String.valueOf(doEvaluate(ref.getBeanName()));
336337
if (ref.isToParent()) {
337338
BeanFactory parent = this.beanFactory.getParentBeanFactory();
338339
if (parent == null) {
@@ -342,21 +343,25 @@ else if (value instanceof String[] values) {
342343
" in parent factory: no parent factory available");
343344
}
344345
if (beanType != null) {
345-
bean = parent.getBean(beanType);
346+
bean = (parent.containsBean(resolvedName) ?
347+
parent.getBean(resolvedName, beanType) : parent.getBean(beanType));
346348
}
347349
else {
348-
bean = parent.getBean(String.valueOf(doEvaluate(ref.getBeanName())));
350+
bean = parent.getBean(resolvedName);
349351
}
350352
}
351353
else {
352-
String resolvedName;
353354
if (beanType != null) {
354-
NamedBeanHolder<?> namedBean = this.beanFactory.resolveNamedBean(beanType);
355-
bean = namedBean.getBeanInstance();
356-
resolvedName = namedBean.getBeanName();
355+
if (this.beanFactory.containsBean(resolvedName)) {
356+
bean = this.beanFactory.getBean(resolvedName, beanType);
357+
}
358+
else {
359+
NamedBeanHolder<?> namedBean = this.beanFactory.resolveNamedBean(beanType);
360+
bean = namedBean.getBeanInstance();
361+
resolvedName = namedBean.getBeanName();
362+
}
357363
}
358364
else {
359-
resolvedName = String.valueOf(doEvaluate(ref.getBeanName()));
360365
bean = this.beanFactory.getBean(resolvedName);
361366
}
362367
this.beanFactory.registerDependentBean(resolvedName, this.beanName);

spring-beans/src/test/java/org/springframework/beans/factory/BeanFactoryUtilsTests.java

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -555,21 +555,33 @@ void testSupportsMultipleTypes(ListableBeanFactory lbf) {
555555
}
556556

557557
@Test
558-
void supportsMultipleTypesWithProperty() {
558+
void supportsMultipleTypesWithPropertyAndSingleBean() {
559559
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
560560
SupportsTypeSmartFactoryBean sfb = new SupportsTypeSmartFactoryBean();
561561
lbf.registerSingleton("sfb", sfb);
562562

563-
RootBeanDefinition rbd1 = new RootBeanDefinition(PropertyRecipient.class);
564-
rbd1.getPropertyValues().add("sfb", new RuntimeBeanReference(ITestBean.class));
565-
lbf.registerBeanDefinition("recipient1", rbd1);
563+
RootBeanDefinition rbd = new RootBeanDefinition(PropertyRecipient.class);
564+
rbd.getPropertyValues().add("sfb", new RuntimeBeanReference(ITestBean.class));
565+
lbf.registerBeanDefinition("recipient", rbd);
566566

567-
RootBeanDefinition rbd2 = new RootBeanDefinition(PropertyRecipient.class);
568-
rbd2.getPropertyValues().add("sfb", new RuntimeBeanReference("sfb", ITestBean.class));
569-
lbf.registerBeanDefinition("recipient2", rbd2);
567+
assertThat(lbf.getBean("recipient", PropertyRecipient.class).sfb)
568+
.isSameAs(lbf.getBean("sfb", ITestBean.class));
569+
}
570+
571+
@Test
572+
void supportsMultipleTypesWithPropertyAndMultipleBeans() {
573+
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
574+
SupportsTypeSmartFactoryBean sfb = new SupportsTypeSmartFactoryBean();
575+
lbf.registerSingleton("sfb", sfb);
576+
SupportsTypeSmartFactoryBean other = new SupportsTypeSmartFactoryBean();
577+
lbf.registerSingleton("other", other);
578+
579+
RootBeanDefinition rbd = new RootBeanDefinition(PropertyRecipient.class);
580+
rbd.getPropertyValues().add("sfb", new RuntimeBeanReference("sfb", ITestBean.class));
581+
lbf.registerBeanDefinition("recipient", rbd);
570582

571-
assertThat(lbf.getBean("recipient1", PropertyRecipient.class).sfb).isSameAs(lbf.getBean("sfb", ITestBean.class));
572-
assertThat(lbf.getBean("recipient2", PropertyRecipient.class).sfb).isSameAs(lbf.getBean("sfb", ITestBean.class));
583+
assertThat(lbf.getBean("recipient", PropertyRecipient.class).sfb)
584+
.isSameAs(lbf.getBean("sfb", ITestBean.class));
573585
}
574586

575587

0 commit comments

Comments
 (0)