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
This commit is contained in:
Phillip Webb
2022-06-04 11:57:02 -07:00
parent 4bd33cb6e0
commit 172102d225
9 changed files with 81 additions and 35 deletions

View File

@@ -81,19 +81,21 @@ class BeanDefinitionMethodGenerator {
* Generate the method that returns the {@link BeanDefinition} to be
* registered.
* @param generationContext the generation context
* @param featureNamePrefix the prefix to use for the feature name
* @param beanRegistrationsCode the bean registrations code
* @return a reference to the generated method.
*/
MethodReference generateBeanDefinitionMethod(GenerationContext generationContext,
BeanRegistrationsCode beanRegistrationsCode) {
String featureNamePrefix, BeanRegistrationsCode beanRegistrationsCode) {
BeanRegistrationCodeFragments codeFragments = getCodeFragments(beanRegistrationsCode);
BeanRegistrationCodeFragments codeFragments = getCodeFragments(beanRegistrationsCode, featureNamePrefix);
Class<?> target = codeFragments.getTarget(this.registeredBean,
this.constructorOrFactoryMethod);
if (!target.getName().startsWith("java.")) {
String featureName = featureNamePrefix + "BeanDefinitions";
GeneratedClass generatedClass = generationContext.getClassGenerator()
.getOrGenerateClass(new BeanDefinitionsJavaFileGenerator(target),
target, "BeanDefinitions");
target, featureName);
MethodGenerator methodGenerator = generatedClass.getMethodGenerator()
.withName(getName());
GeneratedMethod generatedMethod = generateBeanDefinitionMethod(
@@ -112,10 +114,11 @@ class BeanDefinitionMethodGenerator {
}
private BeanRegistrationCodeFragments getCodeFragments(
BeanRegistrationsCode beanRegistrationsCode) {
BeanRegistrationsCode beanRegistrationsCode, String featureNamePrefix) {
BeanRegistrationCodeFragments codeFragments = new DefaultBeanRegistrationCodeFragments(
beanRegistrationsCode, this.registeredBean, this.methodGeneratorFactory);
beanRegistrationsCode, this.registeredBean, this.methodGeneratorFactory,
featureNamePrefix);
for (BeanRegistrationAotContribution aotContribution : this.aotContributions) {
codeFragments = aotContribution.customizeBeanRegistrationCodeFragments(codeFragments);
}

View File

@@ -75,6 +75,7 @@ class BeanDefinitionMethodGeneratorFactory {
* {@link BeanDefinitionMethodGenerator} will include all
* {@link BeanRegistrationAotProcessor} provided contributions.
* @param registeredBean the registered bean
* @param innerBeanPropertyName the inner bean property name or {@code null}
* @return a new {@link BeanDefinitionMethodGenerator} instance or
* {@code null}
*/

View File

@@ -46,10 +46,10 @@ public interface BeanFactoryInitializationCode {
}
/**
* Return the ID of the bean factory or and empty string if no ID is avaialble.
* @return the bean factory ID
* Return the name of the bean factory or and empty string if no ID is available.
* @return the bean factory name
*/
default String getId() {
default String getName() {
return "";
}

View File

@@ -63,12 +63,13 @@ class BeanRegistrationsAotContribution
ClassName className = generationContext.getClassNameGenerator().generateClassName(
beanFactoryInitializationCode.getTarget(),
beanFactoryInitializationCode.getId() + "BeanFactoryRegistrations");
beanFactoryInitializationCode.getName() + "BeanFactoryRegistrations");
BeanRegistrationsCodeGenerator codeGenerator = new BeanRegistrationsCodeGenerator(
className);
GeneratedMethod registerMethod = codeGenerator.getMethodGenerator()
.generateMethod("registerBeanDefinitions")
.using(builder -> generateRegisterMethod(builder, generationContext,
beanFactoryInitializationCode.getName(),
codeGenerator));
JavaFile javaFile = codeGenerator.generatedJavaFile(className);
generationContext.getGeneratedFiles().addSourceFile(javaFile);
@@ -77,7 +78,7 @@ class BeanRegistrationsAotContribution
}
private void generateRegisterMethod(MethodSpec.Builder builder,
GenerationContext generationContext,
GenerationContext generationContext, String featureNamePrefix,
BeanRegistrationsCode beanRegistrationsCode) {
builder.addJavadoc("Register the bean definitions.");
@@ -87,7 +88,7 @@ class BeanRegistrationsAotContribution
CodeBlock.Builder code = CodeBlock.builder();
this.registrations.forEach((beanName, beanDefinitionMethodGenerator) -> {
MethodReference beanDefinitionMethod = beanDefinitionMethodGenerator
.generateBeanDefinitionMethod(generationContext,
.generateBeanDefinitionMethod(generationContext, featureNamePrefix,
beanRegistrationsCode);
code.addStatement("$L.registerBeanDefinition($S, $L)",
BEAN_FACTORY_PARAMETER_NAME, beanName,

View File

@@ -54,14 +54,18 @@ class DefaultBeanRegistrationCodeFragments extends BeanRegistrationCodeFragments
private final BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory;
private final String featureNamePrefix;
DefaultBeanRegistrationCodeFragments(BeanRegistrationsCode beanRegistrationsCode,
RegisteredBean registeredBean,
BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory) {
BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory,
String featureNamePrefix) {
this.beanRegistrationsCode = beanRegistrationsCode;
this.registeredBean = registeredBean;
this.beanDefinitionMethodGeneratorFactory = beanDefinitionMethodGeneratorFactory;
this.featureNamePrefix = featureNamePrefix;
}
@@ -120,7 +124,7 @@ class DefaultBeanRegistrationCodeFragments extends BeanRegistrationCodeFragments
.getBeanDefinitionMethodGenerator(innerRegisteredBean, name);
Assert.state(methodGenerator != null, "Unexpected filtering of inner-bean");
MethodReference generatedMethod = methodGenerator
.generateBeanDefinitionMethod(generationContext,
.generateBeanDefinitionMethod(generationContext, this.featureNamePrefix,
this.beanRegistrationsCode);
return generatedMethod.toInvokeCodeBlock();
}