From ecdf069c5df46c5e15405a1437dcbee00e4f9057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 31 Oct 2025 15:30:54 +0100 Subject: [PATCH] Add AOT support for AutowiredPropertyMarker Closes gh-35731 --- ...onPropertyValueCodeGeneratorDelegates.java | 21 ++++++++++++++++++- .../BeanDefinitionMethodGeneratorTests.java | 18 ++++++++++++++++ ...pertyValueCodeGeneratorDelegatesTests.java | 13 ++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGeneratorDelegates.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGeneratorDelegates.java index 222b50e327b..d2a92ef6229 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGeneratorDelegates.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGeneratorDelegates.java @@ -29,6 +29,7 @@ import org.springframework.aot.generate.ValueCodeGenerator.Delegate; import org.springframework.aot.generate.ValueCodeGeneratorDelegates; import org.springframework.aot.generate.ValueCodeGeneratorDelegates.CollectionDelegate; import org.springframework.aot.generate.ValueCodeGeneratorDelegates.MapDelegate; +import org.springframework.beans.factory.config.AutowiredPropertyMarker; import org.springframework.beans.factory.config.BeanReference; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.config.TypedStringValue; @@ -57,6 +58,7 @@ abstract class BeanDefinitionPropertyValueCodeGeneratorDelegates { *
  • {@link LinkedHashMap}
  • *
  • {@link BeanReference}
  • *
  • {@link TypedStringValue}
  • + *
  • {@link AutowiredPropertyMarker}
  • * * When combined with {@linkplain ValueCodeGeneratorDelegates#INSTANCES the * delegates for common value types}, this should be added first as they have @@ -68,7 +70,8 @@ abstract class BeanDefinitionPropertyValueCodeGeneratorDelegates { new ManagedMapDelegate(), new LinkedHashMapDelegate(), new BeanReferenceDelegate(), - new TypedStringValueDelegate() + new TypedStringValueDelegate(), + new AutowiredPropertyMarkerDelegate() ); @@ -216,4 +219,20 @@ abstract class BeanDefinitionPropertyValueCodeGeneratorDelegates { return valueCodeGenerator.generateCode(value); } } + + /** + * {@link Delegate} for {@link AutowiredPropertyMarker} types. + */ + private static class AutowiredPropertyMarkerDelegate implements Delegate { + + @Override + @Nullable + public CodeBlock generateCode(ValueCodeGenerator valueCodeGenerator, Object value) { + if (value instanceof AutowiredPropertyMarker) { + return CodeBlock.of("$T.INSTANCE", AutowiredPropertyMarker.class); + } + return null; + } + } + } diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorTests.java index 8756eadb014..5e374429ad5 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorTests.java @@ -16,6 +16,7 @@ package org.springframework.beans.factory.aot; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -34,6 +35,7 @@ import org.springframework.aot.generate.GenerationContext; import org.springframework.aot.generate.MethodReference; import org.springframework.aot.generate.MethodReference.ArgumentCodeGenerator; import org.springframework.aot.test.generate.TestGenerationContext; +import org.springframework.beans.factory.config.AutowiredPropertyMarker; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder; import org.springframework.beans.factory.support.BeanDefinitionBuilder; @@ -626,6 +628,22 @@ class BeanDefinitionMethodGeneratorTests { -> assertThat(customPropertyValue.value()).isEqualTo("test"))); } + @Test + void generateBeanDefinitionMethodWhenHasAutowiredPropertyGeneratesMethod() { + RootBeanDefinition beanDefinition = (RootBeanDefinition) BeanDefinitionBuilder + .rootBeanDefinition(CustomBean.class).addAutowiredProperty("innerBean") + .getBeanDefinition(); + RegisteredBean registeredBean = registerBean(beanDefinition); + BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator( + this.methodGeneratorFactory, registeredBean, null, + Collections.emptyList()); + MethodReference method = generator.generateBeanDefinitionMethod( + this.generationContext, this.beanRegistrationsCode); + compile(method, (actual, compiled) -> + assertThat(actual.getPropertyValues().get("innerBean")) + .isSameAs(AutowiredPropertyMarker.INSTANCE)); + } + @Test void generateBeanDefinitionMethodWhenHasAotContributionsAppliesContributions() { RegisteredBean registeredBean = registerBean( diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGeneratorDelegatesTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGeneratorDelegatesTests.java index daf46c53336..15448dcbff3 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGeneratorDelegatesTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGeneratorDelegatesTests.java @@ -39,6 +39,7 @@ import org.springframework.aot.generate.GeneratedClass; import org.springframework.aot.generate.ValueCodeGenerator; import org.springframework.aot.generate.ValueCodeGeneratorDelegates; import org.springframework.aot.test.generate.TestGenerationContext; +import org.springframework.beans.factory.config.AutowiredPropertyMarker; import org.springframework.beans.factory.config.BeanReference; import org.springframework.beans.factory.config.RuntimeBeanNameReference; import org.springframework.beans.factory.config.RuntimeBeanReference; @@ -486,4 +487,16 @@ class BeanDefinitionPropertyValueCodeGeneratorDelegatesTests { } + @Nested + class AutowiredPropertyMarkerTests { + + @Test + void generateWhenAutowiredPropertyMarker() { + compile(AutowiredPropertyMarker.INSTANCE, (instance, compiler) -> + assertThat(instance).isInstanceOf(AutowiredPropertyMarker.class) + .isSameAs(AutowiredPropertyMarker.INSTANCE)); + } + + } + }