Skip to content

Commit a90ed95

Browse files
committed
Support ResolvableType in BeanDefinitionBuilder
Closes gh-27160
1 parent 171b283 commit a90ed95

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.beans.factory.config.AutowiredPropertyMarker;
2222
import org.springframework.beans.factory.config.BeanDefinitionCustomizer;
2323
import org.springframework.beans.factory.config.RuntimeBeanReference;
24+
import org.springframework.core.ResolvableType;
2425
import org.springframework.lang.Nullable;
2526
import org.springframework.util.ObjectUtils;
2627

@@ -102,7 +103,7 @@ public static BeanDefinitionBuilder rootBeanDefinition(String beanClassName, @Nu
102103
* @param beanClass the {@code Class} of the bean that the definition is being created for
103104
*/
104105
public static BeanDefinitionBuilder rootBeanDefinition(Class<?> beanClass) {
105-
return rootBeanDefinition(beanClass, null);
106+
return rootBeanDefinition(beanClass, (String) null);
106107
}
107108

108109
/**
@@ -117,6 +118,30 @@ public static BeanDefinitionBuilder rootBeanDefinition(Class<?> beanClass, @Null
117118
return builder;
118119
}
119120

121+
/**
122+
* Create a new {@code BeanDefinitionBuilder} used to construct a {@link RootBeanDefinition}.
123+
* @param beanType the {@link ResolvableType type} of the bean that the definition is being created for
124+
* @param instanceSupplier a callback for creating an instance of the bean
125+
* @since 5.3.9
126+
*/
127+
public static <T> BeanDefinitionBuilder rootBeanDefinition(ResolvableType beanType, Supplier<T> instanceSupplier) {
128+
RootBeanDefinition beanDefinition = new RootBeanDefinition();
129+
beanDefinition.setTargetType(beanType);
130+
beanDefinition.setInstanceSupplier(instanceSupplier);
131+
return new BeanDefinitionBuilder(beanDefinition);
132+
}
133+
134+
/**
135+
* Create a new {@code BeanDefinitionBuilder} used to construct a {@link RootBeanDefinition}.
136+
* @param beanClass the {@code Class} of the bean that the definition is being created for
137+
* @param instanceSupplier a callback for creating an instance of the bean
138+
* @since 5.3.9
139+
* @see #rootBeanDefinition(ResolvableType, Supplier)
140+
*/
141+
public static <T> BeanDefinitionBuilder rootBeanDefinition(Class<T> beanClass, Supplier<T> instanceSupplier) {
142+
return rootBeanDefinition(ResolvableType.forClass(beanClass), instanceSupplier);
143+
}
144+
120145
/**
121146
* Create a new {@code BeanDefinitionBuilder} used to construct a {@link ChildBeanDefinition}.
122147
* @param parentName the name of the parent bean

spring-beans/src/test/java/org/springframework/beans/factory/support/BeanDefinitionBuilderTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717
package org.springframework.beans.factory.support;
1818

1919
import java.util.Arrays;
20+
import java.util.function.Function;
2021

2122
import org.junit.jupiter.api.Test;
2223

2324
import org.springframework.beans.factory.config.BeanDefinition;
2425
import org.springframework.beans.testfixture.beans.TestBean;
26+
import org.springframework.core.ResolvableType;
2527

2628
import static org.assertj.core.api.Assertions.assertThat;
2729

@@ -75,6 +77,26 @@ void builderWithBeanClassNameAndFactoryMethod() {
7577
assertThat(rbd.getFactoryMethodName()).isEqualTo("create");
7678
}
7779

80+
@Test
81+
void builderWithResolvableTypeAndInstanceSupplier() {
82+
ResolvableType type = ResolvableType.forClassWithGenerics(Function.class, Integer.class, String.class);
83+
Function<Integer, String> function = i -> "value " + i;
84+
RootBeanDefinition rbd = (RootBeanDefinition) BeanDefinitionBuilder
85+
.rootBeanDefinition(type, () -> function).getBeanDefinition();
86+
assertThat(rbd.getResolvableType()).isEqualTo(type);
87+
assertThat(rbd.getInstanceSupplier()).isNotNull();
88+
assertThat(rbd.getInstanceSupplier().get()).isInstanceOf(Function.class);
89+
}
90+
91+
@Test
92+
void builderWithBeanClassAndInstanceSupplier() {
93+
RootBeanDefinition rbd = (RootBeanDefinition) BeanDefinitionBuilder
94+
.rootBeanDefinition(String.class, () -> "test").getBeanDefinition();
95+
assertThat(rbd.getResolvableType().resolve()).isEqualTo(String.class);
96+
assertThat(rbd.getInstanceSupplier()).isNotNull();
97+
assertThat(rbd.getInstanceSupplier().get()).isEqualTo("test");
98+
}
99+
78100
@Test
79101
void builderWithAutowireMode() {
80102
assertThat(BeanDefinitionBuilder.rootBeanDefinition(TestBean.class)

0 commit comments

Comments
 (0)