Add AOT processing of bean aliases

This commit adds AOT processing of bean aliases.

Closes gh-29391
This commit is contained in:
Sébastien Deleuze
2022-11-02 08:27:30 +01:00
parent bfe37c290e
commit 403cfefc28
4 changed files with 85 additions and 15 deletions

View File

@@ -30,12 +30,14 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.javapoet.ClassName;
import org.springframework.javapoet.CodeBlock;
import org.springframework.javapoet.MethodSpec;
import org.springframework.util.MultiValueMap;
/**
* AOT contribution from a {@link BeanRegistrationsAotProcessor} used to
* register bean definitions.
* register bean definitions and aliases.
*
* @author Phillip Webb
* @author Sebastien Deleuze
* @since 6.0
* @see BeanRegistrationsAotProcessor
*/
@@ -46,11 +48,14 @@ class BeanRegistrationsAotContribution
private final Map<String, BeanDefinitionMethodGenerator> registrations;
private final MultiValueMap<String, String> aliases;
BeanRegistrationsAotContribution(
Map<String, BeanDefinitionMethodGenerator> registrations) {
Map<String, BeanDefinitionMethodGenerator> registrations, MultiValueMap<String, String> aliases) {
this.registrations = registrations;
this.aliases = aliases;
}
@@ -64,12 +69,15 @@ class BeanRegistrationsAotContribution
type.addModifiers(Modifier.PUBLIC);
});
BeanRegistrationsCodeGenerator codeGenerator = new BeanRegistrationsCodeGenerator(generatedClass);
GeneratedMethod generatedMethod = codeGenerator.getMethods().add("registerBeanDefinitions", method ->
generateRegisterMethod(method, generationContext, codeGenerator));
beanFactoryInitializationCode.addInitializer(generatedMethod.toMethodReference());
GeneratedMethod generatedBeanDefinitionsMethod = codeGenerator.getMethods().add("registerBeanDefinitions", method ->
generateRegisterBeanDefinitionsMethod(method, generationContext, codeGenerator));
beanFactoryInitializationCode.addInitializer(generatedBeanDefinitionsMethod.toMethodReference());
GeneratedMethod generatedAliasesMethod = codeGenerator.getMethods().add("registerAliases",
this::generateRegisterAliasesMethod);
beanFactoryInitializationCode.addInitializer(generatedAliasesMethod.toMethodReference());
}
private void generateRegisterMethod(MethodSpec.Builder method,
private void generateRegisterBeanDefinitionsMethod(MethodSpec.Builder method,
GenerationContext generationContext,
BeanRegistrationsCode beanRegistrationsCode) {
@@ -91,6 +99,18 @@ class BeanRegistrationsAotContribution
method.addCode(code.build());
}
private void generateRegisterAliasesMethod(MethodSpec.Builder method) {
method.addJavadoc("Register the aliases.");
method.addModifiers(Modifier.PUBLIC);
method.addParameter(DefaultListableBeanFactory.class,
BEAN_FACTORY_PARAMETER_NAME);
CodeBlock.Builder code = CodeBlock.builder();
this.aliases.forEach((beanName, beanAliases) ->
beanAliases.forEach(alias -> code.addStatement("$L.registerAlias($S, $S)", BEAN_FACTORY_PARAMETER_NAME,
beanName, alias)));
method.addCode(code.build());
}
/**
* {@link BeanRegistrationsCode} with generation support.

View File

@@ -21,12 +21,15 @@ import java.util.Map;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.RegisteredBean;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
/**
* {@link BeanFactoryInitializationAotProcessor} that contributes code to
* register beans.
*
* @author Phillip Webb
* @author Sebastien Deleuze
* @since 6.0
*/
class BeanRegistrationsAotProcessor implements BeanFactoryInitializationAotProcessor {
@@ -36,6 +39,7 @@ class BeanRegistrationsAotProcessor implements BeanFactoryInitializationAotProce
BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory =
new BeanDefinitionMethodGeneratorFactory(beanFactory);
Map<String, BeanDefinitionMethodGenerator> registrations = new LinkedHashMap<>();
MultiValueMap<String, String> aliases = new LinkedMultiValueMap<>();
for (String beanName : beanFactory.getBeanDefinitionNames()) {
RegisteredBean registeredBean = RegisteredBean.of(beanFactory, beanName);
BeanDefinitionMethodGenerator beanDefinitionMethodGenerator = beanDefinitionMethodGeneratorFactory
@@ -43,11 +47,14 @@ class BeanRegistrationsAotProcessor implements BeanFactoryInitializationAotProce
if (beanDefinitionMethodGenerator != null) {
registrations.put(beanName, beanDefinitionMethodGenerator);
}
for (String alias : beanFactory.getAliases(beanName)) {
aliases.add(beanName, alias);
}
}
if (registrations.isEmpty()) {
return null;
}
return new BeanRegistrationsAotContribution(registrations);
return new BeanRegistrationsAotContribution(registrations, aliases);
}
}