From 7c9fc575ff9625b21b39cf34e2a524dc8efe0ca9 Mon Sep 17 00:00:00 2001 From: nanfeng <1004789224@qq.com> Date: Fri, 8 Jul 2022 10:59:55 +0800 Subject: [PATCH] Support @Value for record injection Add @Value support for record injection by disabling populateBean() for records, since records are immutable. See gh-28770 Closes gh-28774 --- .../AbstractAutowireCapableBeanFactory.java | 4 ++++ .../configuration/AutowiredConfigurationTests.java | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java index e4e8d74ea0..7d1d2e6158 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java @@ -1353,6 +1353,10 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @param bw the BeanWrapper with bean instance */ protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { + // record has not set methods + if (mbd.getBeanClass().isRecord()) { + return; + } if (bw == null) { if (mbd.hasPropertyValues()) { throw new BeanCreationException( diff --git a/spring-context/src/test/java/org/springframework/context/annotation/configuration/AutowiredConfigurationTests.java b/spring-context/src/test/java/org/springframework/context/annotation/configuration/AutowiredConfigurationTests.java index cd4fac2b13..564e9f7c3e 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/configuration/AutowiredConfigurationTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/configuration/AutowiredConfigurationTests.java @@ -43,6 +43,7 @@ import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.annotation.AliasFor; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; +import org.springframework.core.testfixture.stereotype.Component; import static org.assertj.core.api.Assertions.assertThat; @@ -233,6 +234,15 @@ class AutowiredConfigurationTests { context.close(); } + @Test + void testValueInjectionWithRecord() { + System.setProperty("recordBeanName", "recordBean"); + GenericApplicationContext context = new AnnotationConfigApplicationContext(RecordBean.class); + context.refresh(); + RecordBean recordBean = context.getBean(RecordBean.class); + assertThat(recordBean.name()).isEqualTo("recordBean"); + } + private int contentLength() throws IOException { return (int) new ClassPathResource("do_not_delete_me.txt").contentLength(); } @@ -506,4 +516,8 @@ class AutowiredConfigurationTests { } } + + @Component + static record RecordBean(@Value("recordBeanName") String name) { + } }