Skip to content

Commit 172102d

Browse files
committed
Refine ApplicationContextAotGenerator class name generation
Refine the class name logic so that the name is passed in rather than using `ApplicationContext.getId()`. Also propagate the name so that the generated classes use it. See gh-28565
1 parent 4bd33cb commit 172102d

File tree

9 files changed

+81
-35
lines changed

9 files changed

+81
-35
lines changed

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,19 +81,21 @@ class BeanDefinitionMethodGenerator {
8181
* Generate the method that returns the {@link BeanDefinition} to be
8282
* registered.
8383
* @param generationContext the generation context
84+
* @param featureNamePrefix the prefix to use for the feature name
8485
* @param beanRegistrationsCode the bean registrations code
8586
* @return a reference to the generated method.
8687
*/
8788
MethodReference generateBeanDefinitionMethod(GenerationContext generationContext,
88-
BeanRegistrationsCode beanRegistrationsCode) {
89+
String featureNamePrefix, BeanRegistrationsCode beanRegistrationsCode) {
8990

90-
BeanRegistrationCodeFragments codeFragments = getCodeFragments(beanRegistrationsCode);
91+
BeanRegistrationCodeFragments codeFragments = getCodeFragments(beanRegistrationsCode, featureNamePrefix);
9192
Class<?> target = codeFragments.getTarget(this.registeredBean,
9293
this.constructorOrFactoryMethod);
9394
if (!target.getName().startsWith("java.")) {
95+
String featureName = featureNamePrefix + "BeanDefinitions";
9496
GeneratedClass generatedClass = generationContext.getClassGenerator()
9597
.getOrGenerateClass(new BeanDefinitionsJavaFileGenerator(target),
96-
target, "BeanDefinitions");
98+
target, featureName);
9799
MethodGenerator methodGenerator = generatedClass.getMethodGenerator()
98100
.withName(getName());
99101
GeneratedMethod generatedMethod = generateBeanDefinitionMethod(
@@ -112,10 +114,11 @@ MethodReference generateBeanDefinitionMethod(GenerationContext generationContext
112114
}
113115

114116
private BeanRegistrationCodeFragments getCodeFragments(
115-
BeanRegistrationsCode beanRegistrationsCode) {
117+
BeanRegistrationsCode beanRegistrationsCode, String featureNamePrefix) {
116118

117119
BeanRegistrationCodeFragments codeFragments = new DefaultBeanRegistrationCodeFragments(
118-
beanRegistrationsCode, this.registeredBean, this.methodGeneratorFactory);
120+
beanRegistrationsCode, this.registeredBean, this.methodGeneratorFactory,
121+
featureNamePrefix);
119122
for (BeanRegistrationAotContribution aotContribution : this.aotContributions) {
120123
codeFragments = aotContribution.customizeBeanRegistrationCodeFragments(codeFragments);
121124
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class BeanDefinitionMethodGeneratorFactory {
7575
* {@link BeanDefinitionMethodGenerator} will include all
7676
* {@link BeanRegistrationAotProcessor} provided contributions.
7777
* @param registeredBean the registered bean
78+
* @param innerBeanPropertyName the inner bean property name or {@code null}
7879
* @return a new {@link BeanDefinitionMethodGenerator} instance or
7980
* {@code null}
8081
*/

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ default Class<?> getTarget() {
4646
}
4747

4848
/**
49-
* Return the ID of the bean factory or and empty string if no ID is avaialble.
50-
* @return the bean factory ID
49+
* Return the name of the bean factory or and empty string if no ID is available.
50+
* @return the bean factory name
5151
*/
52-
default String getId() {
52+
default String getName() {
5353
return "";
5454
}
5555

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,13 @@ public void applyTo(GenerationContext generationContext,
6363

6464
ClassName className = generationContext.getClassNameGenerator().generateClassName(
6565
beanFactoryInitializationCode.getTarget(),
66-
beanFactoryInitializationCode.getId() + "BeanFactoryRegistrations");
66+
beanFactoryInitializationCode.getName() + "BeanFactoryRegistrations");
6767
BeanRegistrationsCodeGenerator codeGenerator = new BeanRegistrationsCodeGenerator(
6868
className);
6969
GeneratedMethod registerMethod = codeGenerator.getMethodGenerator()
7070
.generateMethod("registerBeanDefinitions")
7171
.using(builder -> generateRegisterMethod(builder, generationContext,
72+
beanFactoryInitializationCode.getName(),
7273
codeGenerator));
7374
JavaFile javaFile = codeGenerator.generatedJavaFile(className);
7475
generationContext.getGeneratedFiles().addSourceFile(javaFile);
@@ -77,7 +78,7 @@ public void applyTo(GenerationContext generationContext,
7778
}
7879

7980
private void generateRegisterMethod(MethodSpec.Builder builder,
80-
GenerationContext generationContext,
81+
GenerationContext generationContext, String featureNamePrefix,
8182
BeanRegistrationsCode beanRegistrationsCode) {
8283

8384
builder.addJavadoc("Register the bean definitions.");
@@ -87,7 +88,7 @@ private void generateRegisterMethod(MethodSpec.Builder builder,
8788
CodeBlock.Builder code = CodeBlock.builder();
8889
this.registrations.forEach((beanName, beanDefinitionMethodGenerator) -> {
8990
MethodReference beanDefinitionMethod = beanDefinitionMethodGenerator
90-
.generateBeanDefinitionMethod(generationContext,
91+
.generateBeanDefinitionMethod(generationContext, featureNamePrefix,
9192
beanRegistrationsCode);
9293
code.addStatement("$L.registerBeanDefinition($S, $L)",
9394
BEAN_FACTORY_PARAMETER_NAME, beanName,

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,18 @@ class DefaultBeanRegistrationCodeFragments extends BeanRegistrationCodeFragments
5454

5555
private final BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory;
5656

57+
private final String featureNamePrefix;
58+
5759

5860
DefaultBeanRegistrationCodeFragments(BeanRegistrationsCode beanRegistrationsCode,
5961
RegisteredBean registeredBean,
60-
BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory) {
62+
BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory,
63+
String featureNamePrefix) {
6164

6265
this.beanRegistrationsCode = beanRegistrationsCode;
6366
this.registeredBean = registeredBean;
6467
this.beanDefinitionMethodGeneratorFactory = beanDefinitionMethodGeneratorFactory;
68+
this.featureNamePrefix = featureNamePrefix;
6569
}
6670

6771

@@ -120,7 +124,7 @@ protected CodeBlock generateValueCode(GenerationContext generationContext,
120124
.getBeanDefinitionMethodGenerator(innerRegisteredBean, name);
121125
Assert.state(methodGenerator != null, "Unexpected filtering of inner-bean");
122126
MethodReference generatedMethod = methodGenerator
123-
.generateBeanDefinitionMethod(generationContext,
127+
.generateBeanDefinitionMethod(generationContext, this.featureNamePrefix,
124128
this.beanRegistrationsCode);
125129
return generatedMethod.toInvokeCodeBlock();
126130
}

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ void generateBeanDefinitionMethodGeneratesMethod() {
9898
this.methodGeneratorFactory, registeredBean, null,
9999
Collections.emptyList());
100100
MethodReference method = generator.generateBeanDefinitionMethod(
101-
this.generationContext, this.beanRegistrationsCode);
101+
this.generationContext, "", this.beanRegistrationsCode);
102102
testCompiledResult(method, (actual, compiled) -> {
103103
SourceFile sourceFile = compiled.getSourceFile(".*BeanDefinitions");
104104
assertThat(sourceFile).contains("Get the bean definition for 'testBean'");
@@ -116,7 +116,7 @@ void generateBeanDefinitionMethodWhenHasGenericsGeneratesMethod() {
116116
this.methodGeneratorFactory, registeredBean, null,
117117
Collections.emptyList());
118118
MethodReference method = generator.generateBeanDefinitionMethod(
119-
this.generationContext, this.beanRegistrationsCode);
119+
this.generationContext, "", this.beanRegistrationsCode);
120120
testCompiledResult(method, (actual, compiled) -> {
121121
assertThat(actual.getResolvableType().resolve()).isEqualTo(GenericBean.class);
122122
SourceFile sourceFile = compiled.getSourceFile(".*BeanDefinitions");
@@ -149,7 +149,7 @@ void generateBeanDefinitionMethodWhenHasInstancePostProcessorGeneratesMethod() {
149149
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
150150
this.methodGeneratorFactory, registeredBean, null, aotContributions);
151151
MethodReference method = generator.generateBeanDefinitionMethod(
152-
this.generationContext, this.beanRegistrationsCode);
152+
this.generationContext, "", this.beanRegistrationsCode);
153153
testCompiledResult(method, (actual, compiled) -> {
154154
assertThat(actual.getBeanClass()).isEqualTo(TestBean.class);
155155
InstanceSupplier<?> supplier = (InstanceSupplier<?>) actual
@@ -175,7 +175,7 @@ void generateBeanDefinitionMethodWhenHasCodeFragmentsCustomizerGeneratesMethod()
175175
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
176176
this.methodGeneratorFactory, registeredBean, null, aotContributions);
177177
MethodReference method = generator.generateBeanDefinitionMethod(
178-
this.generationContext, this.beanRegistrationsCode);
178+
this.generationContext, "", this.beanRegistrationsCode);
179179
testCompiledResult(method, (actual, compiled) -> {
180180
assertThat(actual.getBeanClass()).isEqualTo(TestBean.class);
181181
SourceFile sourceFile = compiled.getSourceFile(".*BeanDefinitions");
@@ -215,7 +215,7 @@ void generateBeanDefinitionMethodWhenHasAttributeFilterGeneratesMethod() {
215215
this.methodGeneratorFactory, registeredBean, null,
216216
aotContributions);
217217
MethodReference method = generator.generateBeanDefinitionMethod(
218-
this.generationContext, this.beanRegistrationsCode);
218+
this.generationContext, "", this.beanRegistrationsCode);
219219
testCompiledResult(method, (actual, compiled) -> {
220220
assertThat(actual.getAttribute("a")).isEqualTo("A");
221221
assertThat(actual.getAttribute("b")).isNull();
@@ -248,7 +248,7 @@ void generateBeanDefinitionMethodWhenInnerBeanGeneratesMethod() {
248248
this.methodGeneratorFactory, innerBean, "testInnerBean",
249249
Collections.emptyList());
250250
MethodReference method = generator.generateBeanDefinitionMethod(
251-
this.generationContext, this.beanRegistrationsCode);
251+
this.generationContext, "", this.beanRegistrationsCode);
252252
testCompiledResult(method, (actual, compiled) -> {
253253
assertThat(compiled.getSourceFile(".*BeanDefinitions"))
254254
.contains("Get the inner-bean definition for 'testInnerBean'");
@@ -269,7 +269,7 @@ void generateBeanDefinitionMethodWhenHasInnerBeanPropertyValueGeneratesMethod()
269269
this.methodGeneratorFactory, registeredBean, null,
270270
Collections.emptyList());
271271
MethodReference method = generator.generateBeanDefinitionMethod(
272-
this.generationContext, this.beanRegistrationsCode);
272+
this.generationContext, "", this.beanRegistrationsCode);
273273
testCompiledResult(method, (actual, compiled) -> {
274274
RootBeanDefinition actualInnerBeanDefinition = (RootBeanDefinition) actual
275275
.getPropertyValues().get("name");
@@ -303,7 +303,7 @@ void generateBeanDefinitionMethodWhenHasInnerBeanConstructorValueGeneratesMethod
303303
this.methodGeneratorFactory, registeredBean, null,
304304
Collections.emptyList());
305305
MethodReference method = generator.generateBeanDefinitionMethod(
306-
this.generationContext, this.beanRegistrationsCode);
306+
this.generationContext, "", this.beanRegistrationsCode);
307307
testCompiledResult(method, (actual, compiled) -> {
308308
RootBeanDefinition actualInnerBeanDefinition = (RootBeanDefinition) actual
309309
.getConstructorArgumentValues()
@@ -336,7 +336,7 @@ void generateBeanDefinitionMethodWhenHasAotContributionsAppliesContributions() {
336336
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
337337
this.methodGeneratorFactory, registeredBean, null, aotContributions);
338338
MethodReference method = generator.generateBeanDefinitionMethod(
339-
this.generationContext, this.beanRegistrationsCode);
339+
this.generationContext, "", this.beanRegistrationsCode);
340340
testCompiledResult(method, (actual, compiled) -> {
341341
SourceFile sourceFile = compiled.getSourceFile(".*BeanDefinitions");
342342
assertThat(sourceFile).contains("AotContributedMethod()");
@@ -353,7 +353,7 @@ void generateBeanDefinitionMethodWhenPackagePrivateBean() {
353353
this.methodGeneratorFactory, registeredBean, null,
354354
Collections.emptyList());
355355
MethodReference method = generator.generateBeanDefinitionMethod(
356-
this.generationContext, this.beanRegistrationsCode);
356+
this.generationContext, "", this.beanRegistrationsCode);
357357
testCompiledResult(method, false, (actual, compiled) -> {
358358
DefaultListableBeanFactory freshBeanFactory = new DefaultListableBeanFactory();
359359
freshBeanFactory.registerBeanDefinition("test", actual);

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

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.springframework.aot.generate.MethodReference;
3838
import org.springframework.aot.test.generator.compile.Compiled;
3939
import org.springframework.aot.test.generator.compile.TestCompiler;
40+
import org.springframework.aot.test.generator.file.SourceFile;
4041
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
4142
import org.springframework.beans.factory.support.RegisteredBean;
4243
import org.springframework.beans.factory.support.RootBeanDefinition;
@@ -67,7 +68,7 @@ class BeanRegistrationsAotContributionTests {
6768

6869
private BeanDefinitionMethodGeneratorFactory methodGeneratorFactory;
6970

70-
private final MockBeanFactoryInitializationCode beanFactoryInitializationCode = new MockBeanFactoryInitializationCode();
71+
private MockBeanFactoryInitializationCode beanFactoryInitializationCode = new MockBeanFactoryInitializationCode();
7172

7273
@BeforeEach
7374
void setup() {
@@ -98,6 +99,25 @@ void applyToAppliesContribution() {
9899
});
99100
}
100101

102+
@Test
103+
void applyToWhenHasNameGeneratesPrefixedFeatureName() {
104+
this.beanFactoryInitializationCode = new MockBeanFactoryInitializationCode("Management");
105+
Map<String, BeanDefinitionMethodGenerator> registrations = new LinkedHashMap<>();
106+
RegisteredBean registeredBean = registerBean(
107+
new RootBeanDefinition(TestBean.class));
108+
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
109+
this.methodGeneratorFactory, registeredBean, null,
110+
Collections.emptyList());
111+
registrations.put("testBean", generator);
112+
BeanRegistrationsAotContribution contribution = new BeanRegistrationsAotContribution(
113+
registrations);
114+
contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode);
115+
testCompiledResult((consumer, compiled) -> {
116+
SourceFile sourceFile = compiled.getSourceFile(".*BeanDefinitions");
117+
assertThat(sourceFile.getClassName()).endsWith("__ManagementBeanDefinitions");
118+
});
119+
}
120+
101121
@Test
102122
void applyToCallsRegistrationsWithBeanRegistrationsCode() {
103123
List<BeanRegistrationsCode> beanRegistrationsCodes = new ArrayList<>();
@@ -110,11 +130,11 @@ void applyToCallsRegistrationsWithBeanRegistrationsCode() {
110130

111131
@Override
112132
MethodReference generateBeanDefinitionMethod(
113-
GenerationContext generationContext,
133+
GenerationContext generationContext, String featureNamePrefix,
114134
BeanRegistrationsCode beanRegistrationsCode) {
115135
beanRegistrationsCodes.add(beanRegistrationsCode);
116136
return super.generateBeanDefinitionMethod(generationContext,
117-
beanRegistrationsCode);
137+
featureNamePrefix, beanRegistrationsCode);
118138
}
119139

120140
};
@@ -163,6 +183,21 @@ class MockBeanFactoryInitializationCode implements BeanFactoryInitializationCode
163183

164184
private final List<MethodReference> initializers = new ArrayList<>();
165185

186+
private final String name;
187+
188+
MockBeanFactoryInitializationCode() {
189+
this("");
190+
}
191+
192+
MockBeanFactoryInitializationCode(String name) {
193+
this.name = name;
194+
}
195+
196+
@Override
197+
public String getName() {
198+
return this.name;
199+
}
200+
166201
@Override
167202
public MethodGenerator getMethodGenerator() {
168203
return this.generatedMethods;

spring-context/src/main/java/org/springframework/context/aot/ApplicationContextAotGenerator.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void generateApplicationContext(GenericApplicationContext applicationCont
4949
GenerationContext generationContext,
5050
ClassName generatedInitializerClassName) {
5151

52-
generateApplicationContext(applicationContext, null, generationContext,
52+
generateApplicationContext(applicationContext, null, null, generationContext,
5353
generatedInitializerClassName);
5454
}
5555

@@ -58,20 +58,21 @@ public void generateApplicationContext(GenericApplicationContext applicationCont
5858
* necessary code to restore the state of its {@link BeanFactory}, using the
5959
* specified {@link GenerationContext}.
6060
* @param applicationContext the application context to handle
61-
* @param target the target class for the generated initializer
61+
* @param target the target class for the generated initializer (used when generating class names)
62+
* @param name the name of the application context (used when generating class names)
6263
* @param generationContext the generation context to use
6364
* @param generatedInitializerClassName the class name to use for the
6465
* generated application context initializer
6566
*/
6667
public void generateApplicationContext(GenericApplicationContext applicationContext,
67-
@Nullable Class<?> target, GenerationContext generationContext,
68+
@Nullable Class<?> target, @Nullable String name, GenerationContext generationContext,
6869
ClassName generatedInitializerClassName) {
6970

7071
applicationContext.refreshForAotProcessing();
7172
DefaultListableBeanFactory beanFactory = applicationContext
7273
.getDefaultListableBeanFactory();
7374
ApplicationContextInitializationCodeGenerator codeGenerator = new ApplicationContextInitializationCodeGenerator(
74-
target, applicationContext.getId());
75+
target, name);
7576
new BeanFactoryInitializationAotContributions(beanFactory).applyTo(generationContext,
7677
codeGenerator);
7778
JavaFile javaFile = codeGenerator.generateJavaFile(generatedInitializerClassName);

spring-context/src/main/java/org/springframework/context/aot/ApplicationContextInitializationCodeGenerator.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.javapoet.MethodSpec;
3636
import org.springframework.javapoet.ParameterizedTypeName;
3737
import org.springframework.javapoet.TypeSpec;
38+
import org.springframework.lang.Nullable;
3839
import org.springframework.util.StringUtils;
3940

4041
/**
@@ -51,16 +52,16 @@ class ApplicationContextInitializationCodeGenerator
5152

5253
private final Class<?> target;
5354

54-
private final String id;
55+
private final String name;
5556

5657
private final GeneratedMethods generatedMethods = new GeneratedMethods();
5758

5859
private final List<MethodReference> initializers = new ArrayList<>();
5960

6061

61-
ApplicationContextInitializationCodeGenerator(Class<?> target, String id) {
62+
ApplicationContextInitializationCodeGenerator(Class<?> target, @Nullable String name) {
6263
this.target=target;
63-
this.id = (!StringUtils.hasText(id)) ? "" : id;
64+
this.name = (!StringUtils.hasText(name)) ? "" : name;
6465
}
6566

6667

@@ -70,8 +71,8 @@ public Class<?> getTarget() {
7071
}
7172

7273
@Override
73-
public String getId() {
74-
return this.id;
74+
public String getName() {
75+
return this.name;
7576
}
7677

7778
@Override

0 commit comments

Comments
 (0)