diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationKey.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationKey.java new file mode 100644 index 00000000000..bd99bebca96 --- /dev/null +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationKey.java @@ -0,0 +1,27 @@ +/* + * Copyright 2002-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.beans.factory.aot; + +/** + * Record class holding key information for beans registered in a bean factory. + * @param beanName the name of the registered bean + * @param beanClass the type of the registered bean + * @author Brian Clozel + * @since 6.0 + */ +record BeanRegistrationKey(String beanName, Class beanClass) { +} 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 d15191a3bb1..1ad7d6a8731 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 @@ -29,7 +29,6 @@ import org.springframework.aot.generate.MethodReference.ArgumentCodeGenerator; import org.springframework.aot.hint.MemberCategory; import org.springframework.aot.hint.RuntimeHints; import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.beans.factory.support.RegisteredBean; import org.springframework.javapoet.ClassName; import org.springframework.javapoet.CodeBlock; import org.springframework.javapoet.MethodSpec; @@ -48,11 +47,11 @@ class BeanRegistrationsAotContribution private static final String BEAN_FACTORY_PARAMETER_NAME = "beanFactory"; - private final Map registrations; + private final Map registrations; BeanRegistrationsAotContribution( - Map registrations) { + Map registrations) { this.registrations = registrations; } @@ -74,9 +73,9 @@ class BeanRegistrationsAotContribution generateRegisterHints(generationContext.getRuntimeHints(), this.registrations); } - private void generateRegisterHints(RuntimeHints runtimeHints, Map registrations) { - registrations.keySet().forEach(registeredBean -> runtimeHints.reflection() - .registerType(registeredBean.getBeanClass(), MemberCategory.INTROSPECT_DECLARED_METHODS)); + private void generateRegisterHints(RuntimeHints runtimeHints, Map registrations) { + registrations.keySet().forEach(beanRegistrationKey -> runtimeHints.reflection() + .registerType(beanRegistrationKey.beanClass(), MemberCategory.INTROSPECT_DECLARED_METHODS)); } @@ -89,14 +88,14 @@ class BeanRegistrationsAotContribution method.addParameter(DefaultListableBeanFactory.class, BEAN_FACTORY_PARAMETER_NAME); CodeBlock.Builder code = CodeBlock.builder(); - this.registrations.forEach((registeredBean, beanDefinitionMethodGenerator) -> { + this.registrations.forEach((beanRegistrationKey, beanDefinitionMethodGenerator) -> { MethodReference beanDefinitionMethod = beanDefinitionMethodGenerator .generateBeanDefinitionMethod(generationContext, beanRegistrationsCode); CodeBlock methodInvocation = beanDefinitionMethod.toInvokeCodeBlock( ArgumentCodeGenerator.none(), beanRegistrationsCode.getClassName()); code.addStatement("$L.registerBeanDefinition($S, $L)", - BEAN_FACTORY_PARAMETER_NAME, registeredBean.getBeanName(), + BEAN_FACTORY_PARAMETER_NAME, beanRegistrationKey.beanName(), methodInvocation); }); method.addCode(code.build()); 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 50545dfbdf5..2ef54446ff8 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 @@ -36,13 +36,13 @@ class BeanRegistrationsAotProcessor implements BeanFactoryInitializationAotProce public BeanRegistrationsAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) { BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory = new BeanDefinitionMethodGeneratorFactory(beanFactory); - Map registrations = new LinkedHashMap<>(); + Map registrations = new LinkedHashMap<>(); for (String beanName : beanFactory.getBeanDefinitionNames()) { RegisteredBean registeredBean = RegisteredBean.of(beanFactory, beanName); BeanDefinitionMethodGenerator beanDefinitionMethodGenerator = beanDefinitionMethodGeneratorFactory .getBeanDefinitionMethodGenerator(registeredBean, null); if (beanDefinitionMethodGenerator != null) { - registrations.put(registeredBean, beanDefinitionMethodGenerator); + registrations.put(new BeanRegistrationKey(beanName, registeredBean.getBeanClass()), beanDefinitionMethodGenerator); } } if (registrations.isEmpty()) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/RegisteredBean.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/RegisteredBean.java index 5e93e5ac9ee..d4ff6f070ea 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/RegisteredBean.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/RegisteredBean.java @@ -16,7 +16,6 @@ package org.springframework.beans.factory.support; -import java.util.Objects; import java.util.function.BiFunction; import java.util.function.Supplier; @@ -196,23 +195,6 @@ public final class RegisteredBean { return this.parent; } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - RegisteredBean that = (RegisteredBean) o; - return this.beanName.equals(that.beanName); - } - - @Override - public int hashCode() { - return Objects.hash(this.beanName); - } - @Override public String toString() { return new ToStringCreator(this).append("beanName", getBeanName()) 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 c059540591a..acf0fdae6dd 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 @@ -78,13 +78,13 @@ class BeanRegistrationsAotContributionTests { @Test void applyToAppliesContribution() { - Map registrations = new LinkedHashMap<>(); + Map registrations = new LinkedHashMap<>(); RegisteredBean registeredBean = registerBean( new RootBeanDefinition(TestBean.class)); BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator( this.methodGeneratorFactory, registeredBean, null, Collections.emptyList()); - registrations.put(registeredBean, generator); + registrations.put(new BeanRegistrationKey(registeredBean.getBeanName(), registeredBean.getBeanClass()), generator); BeanRegistrationsAotContribution contribution = new BeanRegistrationsAotContribution( registrations); contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode); @@ -100,13 +100,13 @@ class BeanRegistrationsAotContributionTests { this.generationContext = new TestGenerationContext( new ClassNameGenerator(TestGenerationContext.TEST_TARGET, "Management")); this.beanFactoryInitializationCode = new MockBeanFactoryInitializationCode(this.generationContext); - Map registrations = new LinkedHashMap<>(); + Map registrations = new LinkedHashMap<>(); RegisteredBean registeredBean = registerBean( new RootBeanDefinition(TestBean.class)); BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator( this.methodGeneratorFactory, registeredBean, null, Collections.emptyList()); - registrations.put(registeredBean, generator); + registrations.put(new BeanRegistrationKey(registeredBean.getBeanName(), registeredBean.getBeanClass()), generator); BeanRegistrationsAotContribution contribution = new BeanRegistrationsAotContribution( registrations); contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode); @@ -119,7 +119,7 @@ class BeanRegistrationsAotContributionTests { @Test void applyToCallsRegistrationsWithBeanRegistrationsCode() { List beanRegistrationsCodes = new ArrayList<>(); - Map registrations = new LinkedHashMap<>(); + Map registrations = new LinkedHashMap<>(); RegisteredBean registeredBean = registerBean( new RootBeanDefinition(TestBean.class)); BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator( @@ -136,7 +136,7 @@ class BeanRegistrationsAotContributionTests { } }; - registrations.put(registeredBean, generator); + registrations.put(new BeanRegistrationKey(registeredBean.getBeanName(), registeredBean.getBeanClass()), generator); BeanRegistrationsAotContribution contribution = new BeanRegistrationsAotContribution( registrations); contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode); @@ -147,13 +147,13 @@ class BeanRegistrationsAotContributionTests { @Test void applyToRegisterReflectionHints() { - Map registrations = new LinkedHashMap<>(); + Map registrations = new LinkedHashMap<>(); RegisteredBean registeredBean = registerBean( new RootBeanDefinition(TestBean.class)); BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator( this.methodGeneratorFactory, registeredBean, null, Collections.emptyList()); - registrations.put(registeredBean, generator); + registrations.put(new BeanRegistrationKey(registeredBean.getBeanName(), registeredBean.getBeanClass()), generator); BeanRegistrationsAotContribution contribution = new BeanRegistrationsAotContribution( registrations); contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode);