Skip to content

Commit 90ffa95

Browse files
committed
Merge branch '6.0.x'
2 parents 825f160 + cefb734 commit 90ffa95

File tree

3 files changed

+49
-9
lines changed

3 files changed

+49
-9
lines changed

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.aot.generate.MethodReference;
2828
import org.springframework.aot.generate.MethodReference.ArgumentCodeGenerator;
2929
import org.springframework.aot.hint.MemberCategory;
30+
import org.springframework.aot.hint.ReflectionHints;
3031
import org.springframework.aot.hint.RuntimeHints;
3132
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
3233
import org.springframework.javapoet.ClassName;
@@ -109,8 +110,15 @@ private void generateRegisterAliasesMethod(MethodSpec.Builder method) {
109110
}
110111

111112
private void generateRegisterHints(RuntimeHints runtimeHints, Map<BeanRegistrationKey, Registration> registrations) {
112-
registrations.keySet().forEach(beanRegistrationKey -> runtimeHints.reflection()
113-
.registerType(beanRegistrationKey.beanClass(), MemberCategory.INTROSPECT_DECLARED_METHODS));
113+
registrations.keySet().forEach(beanRegistrationKey -> {
114+
ReflectionHints hints = runtimeHints.reflection();
115+
Class<?> beanClass = beanRegistrationKey.beanClass();
116+
hints.registerType(beanClass, MemberCategory.INTROSPECT_DECLARED_METHODS);
117+
// Workaround for https://github.com/oracle/graal/issues/6510
118+
if (beanClass.isRecord()) {
119+
hints.registerType(beanClass, MemberCategory.INVOKE_DECLARED_METHODS);
120+
}
121+
});
114122
}
115123

116124
/**

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

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
3737
import org.springframework.beans.factory.support.RegisteredBean;
3838
import org.springframework.beans.factory.support.RootBeanDefinition;
39+
import org.springframework.beans.testfixture.beans.RecordBean;
3940
import org.springframework.beans.testfixture.beans.TestBean;
4041
import org.springframework.beans.testfixture.beans.factory.aot.MockBeanFactoryInitializationCode;
4142
import org.springframework.core.test.io.support.MockSpringFactoriesLoader;
@@ -75,7 +76,7 @@ void applyToAppliesContribution() {
7576
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class));
7677
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(this.methodGeneratorFactory,
7778
registeredBean, null, List.of());
78-
BeanRegistrationsAotContribution contribution = createContribution(generator);
79+
BeanRegistrationsAotContribution contribution = createContribution(TestBean.class, generator);
7980
contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode);
8081
compile((consumer, compiled) -> {
8182
DefaultListableBeanFactory freshBeanFactory = new DefaultListableBeanFactory();
@@ -89,7 +90,7 @@ void applyToAppliesContributionWithAliases() {
8990
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class));
9091
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(this.methodGeneratorFactory,
9192
registeredBean, null, List.of());
92-
BeanRegistrationsAotContribution contribution = createContribution(generator, "testAlias");
93+
BeanRegistrationsAotContribution contribution = createContribution(TestBean.class, generator, "testAlias");
9394
contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode);
9495
compile((consumer, compiled) -> {
9596
DefaultListableBeanFactory freshBeanFactory = new DefaultListableBeanFactory();
@@ -106,7 +107,7 @@ void applyToWhenHasNameGeneratesPrefixedFeatureName() {
106107
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class));
107108
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(this.methodGeneratorFactory,
108109
registeredBean, null, List.of());
109-
BeanRegistrationsAotContribution contribution = createContribution(generator);
110+
BeanRegistrationsAotContribution contribution = createContribution(TestBean.class, generator);
110111
contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode);
111112
compile((consumer, compiled) -> {
112113
SourceFile sourceFile = compiled.getSourceFile(".*BeanDefinitions");
@@ -129,7 +130,7 @@ MethodReference generateBeanDefinitionMethod(GenerationContext generationContext
129130
}
130131

131132
};
132-
BeanRegistrationsAotContribution contribution = createContribution(generator);
133+
BeanRegistrationsAotContribution contribution = createContribution(TestBean.class, generator);
133134
contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode);
134135
assertThat(beanRegistrationsCodes).hasSize(1);
135136
BeanRegistrationsCode actual = beanRegistrationsCodes.get(0);
@@ -141,13 +142,25 @@ void applyToRegisterReflectionHints() {
141142
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class));
142143
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(this.methodGeneratorFactory,
143144
registeredBean, null, List.of());
144-
BeanRegistrationsAotContribution contribution = createContribution(generator);
145+
BeanRegistrationsAotContribution contribution = createContribution(TestBean.class, generator);
145146
contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode);
146147
assertThat(reflection().onType(TestBean.class)
147148
.withMemberCategory(MemberCategory.INTROSPECT_DECLARED_METHODS))
148149
.accepts(this.generationContext.getRuntimeHints());
149150
}
150151

152+
@Test
153+
void applyToRegisterReflectionHintsOnRecordBean() {
154+
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(RecordBean.class));
155+
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(this.methodGeneratorFactory,
156+
registeredBean, null, List.of());
157+
BeanRegistrationsAotContribution contribution = createContribution(RecordBean.class, generator);
158+
contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode);
159+
assertThat(reflection().onType(RecordBean.class)
160+
.withMemberCategories(MemberCategory.INTROSPECT_DECLARED_METHODS, MemberCategory.INVOKE_DECLARED_METHODS))
161+
.accepts(this.generationContext.getRuntimeHints());
162+
}
163+
151164
private RegisteredBean registerBean(RootBeanDefinition rootBeanDefinition) {
152165
String beanName = "testBean";
153166
this.beanFactory.registerBeanDefinition(beanName, rootBeanDefinition);
@@ -177,10 +190,10 @@ private void compile(BiConsumer<Consumer<DefaultListableBeanFactory>, Compiled>
177190
result.accept(compiled.getInstance(Consumer.class), compiled));
178191
}
179192

180-
private BeanRegistrationsAotContribution createContribution(
193+
private BeanRegistrationsAotContribution createContribution(Class<?> beanClass,
181194
BeanDefinitionMethodGenerator methodGenerator,String... aliases) {
182195
return new BeanRegistrationsAotContribution(
183-
Map.of(new BeanRegistrationKey("testBean", TestBean.class), new Registration(methodGenerator, aliases)));
196+
Map.of(new BeanRegistrationKey("testBean", beanClass), new Registration(methodGenerator, aliases)));
184197
}
185198

186199
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright 2002-2023 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.beans.testfixture.beans;
18+
19+
public record RecordBean(String name) { }

0 commit comments

Comments
 (0)