Skip to content

Commit 1acb41f

Browse files
committed
Add AOT support for by-type RuntimeBeanReference
Closes gh-28841
1 parent cd4f4d9 commit 1acb41f

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGenerator.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,12 @@ private static class BeanReferenceDelegate implements Delegate {
513513
@Override
514514
@Nullable
515515
public CodeBlock generateCode(Object value, ResolvableType type) {
516-
if (value instanceof BeanReference beanReference) {
516+
if (value instanceof RuntimeBeanReference runtimeBeanReference
517+
&& runtimeBeanReference.getBeanType() != null) {
518+
return CodeBlock.of("new $T($T.class)", RuntimeBeanReference.class,
519+
runtimeBeanReference.getBeanType());
520+
}
521+
else if (value instanceof BeanReference beanReference) {
517522
return CodeBlock.of("new $T($S)", RuntimeBeanReference.class,
518523
beanReference.getBeanName());
519524
}

spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGeneratorTests.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.springframework.aot.test.generator.compile.TestCompiler;
4141
import org.springframework.beans.factory.config.BeanReference;
4242
import org.springframework.beans.factory.config.RuntimeBeanNameReference;
43+
import org.springframework.beans.factory.config.RuntimeBeanReference;
4344
import org.springframework.beans.factory.support.ManagedList;
4445
import org.springframework.beans.factory.support.ManagedMap;
4546
import org.springframework.beans.factory.support.ManagedSet;
@@ -465,10 +466,31 @@ void generateWhenLinkedHashMap() {
465466
class BeanReferenceTests {
466467

467468
@Test
468-
void generatedWhenBeanReference() {
469-
BeanReference beanReference = new RuntimeBeanNameReference("test");
470-
compile(beanReference, (instance, compiler) ->
471-
assertThat(((BeanReference) instance).getBeanName()).isEqualTo(beanReference.getBeanName()));
469+
void generatedWhenBeanNameReference() {
470+
RuntimeBeanNameReference beanReference = new RuntimeBeanNameReference("test");
471+
compile(beanReference, (instance, compiler) -> {
472+
RuntimeBeanReference actual = (RuntimeBeanReference) instance;
473+
assertThat(actual.getBeanName()).isEqualTo(beanReference.getBeanName());
474+
});
475+
}
476+
477+
@Test
478+
void generatedWhenBeanReferenceByName() {
479+
RuntimeBeanReference beanReference = new RuntimeBeanReference("test");
480+
compile(beanReference, (instance, compiler) -> {
481+
RuntimeBeanReference actual = (RuntimeBeanReference) instance;
482+
assertThat(actual.getBeanName()).isEqualTo(beanReference.getBeanName());
483+
assertThat(actual.getBeanType()).isEqualTo(beanReference.getBeanType());
484+
});
485+
}
486+
487+
@Test
488+
void generatedWhenBeanReferenceByType() {
489+
BeanReference beanReference = new RuntimeBeanReference(String.class);
490+
compile(beanReference, (instance, compiler) -> {
491+
RuntimeBeanReference actual = (RuntimeBeanReference) instance;
492+
assertThat(actual.getBeanType()).isEqualTo(String.class);
493+
});
472494
}
473495

474496
}

0 commit comments

Comments
 (0)