From 711a63adca77745b0fdf62139a77e26caf01571b Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 15 Nov 2022 11:39:39 +0100 Subject: [PATCH] Polish See gh-29391 --- .../aot/BeanRegistrationsAotContribution.java | 32 +++++++++++-------- .../aot/BeanRegistrationsAotProcessor.java | 15 ++++----- ...BeanRegistrationsAotContributionTests.java | 32 +++++++------------ .../BeanRegistrationsAotProcessorTests.java | 7 ++-- 4 files changed, 39 insertions(+), 47 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationsAotContribution.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationsAotContribution.java index e29f60a42b..bda1d47135 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationsAotContribution.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationsAotContribution.java @@ -30,7 +30,6 @@ 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 @@ -38,6 +37,7 @@ import org.springframework.util.MultiValueMap; * * @author Phillip Webb * @author Sebastien Deleuze + * @author Stephane Nicoll * @since 6.0 * @see BeanRegistrationsAotProcessor */ @@ -46,16 +46,10 @@ class BeanRegistrationsAotContribution private static final String BEAN_FACTORY_PARAMETER_NAME = "beanFactory"; - private final Map registrations; - - private final MultiValueMap aliases; - - - BeanRegistrationsAotContribution( - Map registrations, MultiValueMap aliases) { + private final Map registrations; + BeanRegistrationsAotContribution(Map registrations) { this.registrations = registrations; - this.aliases = aliases; } @@ -86,8 +80,8 @@ class BeanRegistrationsAotContribution method.addParameter(DefaultListableBeanFactory.class, BEAN_FACTORY_PARAMETER_NAME); CodeBlock.Builder code = CodeBlock.builder(); - this.registrations.forEach((beanName, beanDefinitionMethodGenerator) -> { - MethodReference beanDefinitionMethod = beanDefinitionMethodGenerator + this.registrations.forEach((beanName, registration) -> { + MethodReference beanDefinitionMethod = registration.methodGenerator .generateBeanDefinitionMethod(generationContext, beanRegistrationsCode); CodeBlock methodInvocation = beanDefinitionMethod.toInvokeCodeBlock( @@ -105,12 +99,22 @@ class BeanRegistrationsAotContribution 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))); + this.registrations.forEach((beanName, registration) -> { + for (String alias : registration.aliases) { + code.addStatement("$L.registerAlias($S, $S)", + BEAN_FACTORY_PARAMETER_NAME, beanName, alias); + } + }); method.addCode(code.build()); } + /** + * Gather the necessary information to register a particular bean. + * @param methodGenerator the {@link BeanDefinitionMethodGenerator} to use + * @param aliases the bean aliases, if any + */ + record Registration(BeanDefinitionMethodGenerator methodGenerator, String[] aliases) {} + /** * {@link BeanRegistrationsCode} with generation support. diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationsAotProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationsAotProcessor.java index ac3657f21a..cbbdcf0680 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationsAotProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationsAotProcessor.java @@ -19,10 +19,9 @@ package org.springframework.beans.factory.aot; import java.util.LinkedHashMap; import java.util.Map; +import org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.Registration; 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 @@ -30,6 +29,7 @@ import org.springframework.util.MultiValueMap; * * @author Phillip Webb * @author Sebastien Deleuze + * @author Stephane Nicoll * @since 6.0 */ class BeanRegistrationsAotProcessor implements BeanFactoryInitializationAotProcessor { @@ -38,23 +38,20 @@ class BeanRegistrationsAotProcessor implements BeanFactoryInitializationAotProce public BeanRegistrationsAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) { BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory = new BeanDefinitionMethodGeneratorFactory(beanFactory); - Map registrations = new LinkedHashMap<>(); - MultiValueMap aliases = new LinkedMultiValueMap<>(); + Map registrations = new LinkedHashMap<>(); for (String beanName : beanFactory.getBeanDefinitionNames()) { RegisteredBean registeredBean = RegisteredBean.of(beanFactory, beanName); BeanDefinitionMethodGenerator beanDefinitionMethodGenerator = beanDefinitionMethodGeneratorFactory .getBeanDefinitionMethodGenerator(registeredBean); if (beanDefinitionMethodGenerator != null) { - registrations.put(beanName, beanDefinitionMethodGenerator); - } - for (String alias : beanFactory.getAliases(beanName)) { - aliases.add(beanName, alias); + registrations.put(beanName, new Registration(beanDefinitionMethodGenerator, + beanFactory.getAliases(beanName))); } } if (registrations.isEmpty()) { return null; } - return new BeanRegistrationsAotContribution(registrations, aliases); + return new BeanRegistrationsAotContribution(registrations); } } diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanRegistrationsAotContributionTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanRegistrationsAotContributionTests.java index 1f44cfe770..6ed07a5fd5 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanRegistrationsAotContributionTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanRegistrationsAotContributionTests.java @@ -18,7 +18,6 @@ package org.springframework.beans.factory.aot; import java.util.ArrayList; import java.util.Collections; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.BiConsumer; @@ -46,16 +45,16 @@ import org.springframework.javapoet.ClassName; import org.springframework.javapoet.CodeBlock; import org.springframework.javapoet.MethodSpec; import org.springframework.javapoet.ParameterizedTypeName; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.Registration; /** * Tests for {@link BeanRegistrationsAotContribution}. * * @author Phillip Webb * @author Sebastien Deleuze + * @author Stephane Nicoll */ class BeanRegistrationsAotContributionTests { @@ -80,15 +79,12 @@ class BeanRegistrationsAotContributionTests { @Test void applyToAppliesContribution() { - Map registrations = new LinkedHashMap<>(); RegisteredBean registeredBean = registerBean( new RootBeanDefinition(TestBean.class)); BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator( this.methodGeneratorFactory, registeredBean, null, Collections.emptyList()); - registrations.put("testBean", generator); - BeanRegistrationsAotContribution contribution = new BeanRegistrationsAotContribution( - registrations, new LinkedMultiValueMap<>()); + BeanRegistrationsAotContribution contribution = createContribution(generator); contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode); compile((consumer, compiled) -> { DefaultListableBeanFactory freshBeanFactory = new DefaultListableBeanFactory(); @@ -99,17 +95,12 @@ class BeanRegistrationsAotContributionTests { @Test void applyToAppliesContributionWithAliases() { - Map registrations = new LinkedHashMap<>(); RegisteredBean registeredBean = registerBean( new RootBeanDefinition(TestBean.class)); BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator( this.methodGeneratorFactory, registeredBean, null, Collections.emptyList()); - registrations.put("testBean", generator); - MultiValueMap aliases = new LinkedMultiValueMap<>(); - aliases.add("testBean", "testAlias"); - BeanRegistrationsAotContribution contribution = new BeanRegistrationsAotContribution( - registrations, aliases); + BeanRegistrationsAotContribution contribution = createContribution(generator, "testAlias"); contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode); compile((consumer, compiled) -> { DefaultListableBeanFactory freshBeanFactory = new DefaultListableBeanFactory(); @@ -123,15 +114,12 @@ class BeanRegistrationsAotContributionTests { this.generationContext = new TestGenerationContext( new ClassNameGenerator(TestGenerationContext.TEST_TARGET, "Management")); this.beanFactoryInitializationCode = new MockBeanFactoryInitializationCode(this.generationContext); - Map registrations = new LinkedHashMap<>(); RegisteredBean registeredBean = registerBean( new RootBeanDefinition(TestBean.class)); BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator( this.methodGeneratorFactory, registeredBean, null, Collections.emptyList()); - registrations.put("testBean", generator); - BeanRegistrationsAotContribution contribution = new BeanRegistrationsAotContribution( - registrations, new LinkedMultiValueMap<>()); + BeanRegistrationsAotContribution contribution = createContribution(generator); contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode); compile((consumer, compiled) -> { SourceFile sourceFile = compiled.getSourceFile(".*BeanDefinitions"); @@ -142,7 +130,6 @@ class BeanRegistrationsAotContributionTests { @Test void applyToCallsRegistrationsWithBeanRegistrationsCode() { List beanRegistrationsCodes = new ArrayList<>(); - Map registrations = new LinkedHashMap<>(); RegisteredBean registeredBean = registerBean( new RootBeanDefinition(TestBean.class)); BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator( @@ -159,9 +146,7 @@ class BeanRegistrationsAotContributionTests { } }; - registrations.put("testBean", generator); - BeanRegistrationsAotContribution contribution = new BeanRegistrationsAotContribution( - registrations, new LinkedMultiValueMap<>()); + BeanRegistrationsAotContribution contribution = createContribution(generator); contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode); assertThat(beanRegistrationsCodes).hasSize(1); BeanRegistrationsCode actual = beanRegistrationsCodes.get(0); @@ -199,4 +184,9 @@ class BeanRegistrationsAotContributionTests { result.accept(compiled.getInstance(Consumer.class), compiled)); } + private BeanRegistrationsAotContribution createContribution( + BeanDefinitionMethodGenerator methodGenerator,String... aliases) { + return new BeanRegistrationsAotContribution(Map.of("testBean", new Registration(methodGenerator, aliases))); + } + } diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanRegistrationsAotProcessorTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanRegistrationsAotProcessorTests.java index f6cd6b20a5..cb1e39f106 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanRegistrationsAotProcessorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanRegistrationsAotProcessorTests.java @@ -62,9 +62,10 @@ class BeanRegistrationsAotProcessorTests { beanFactory.registerAlias("test", "testAlias"); BeanRegistrationsAotContribution contribution = processor .processAheadOfTime(beanFactory); - assertThat(contribution).extracting("aliases") - .asInstanceOf(InstanceOfAssertFactories.MAP).hasEntrySatisfying("test", value -> - assertThat(value).asList().singleElement().isEqualTo("testAlias")); + assertThat(contribution).extracting("registrations").asInstanceOf(InstanceOfAssertFactories.MAP) + .hasEntrySatisfying("test", registration -> + assertThat(registration).extracting("aliases").asInstanceOf(InstanceOfAssertFactories.ARRAY) + .singleElement().isEqualTo("testAlias")); } }