From d7e950d2ac8f806a4d5229732abd282c723b3f6d Mon Sep 17 00:00:00 2001 From: wakingrufus Date: Thu, 16 Oct 2025 16:52:45 -0500 Subject: [PATCH] fix ConfigurationClassParser so that @Imported BeanRegistrars use their own class name rather than the class they are imported to This allows multiple BeanRegistrars to be imported from the same Configuration class fixes #35652 Signed-off-by: wakingrufus --- .../annotation/ConfigurationClassParser.java | 2 +- ...lassPostProcessorAotContributionTests.java | 2 +- .../BeanRegistrarDslConfigurationTests.kt | 20 +++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java index 69c2b252a309..5598dcebe537 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java @@ -615,7 +615,7 @@ else if (candidate.isAssignable(BeanRegistrar.class)) { if (registrar instanceof ImportAware importAware) { importAware.setImportMetadata(metadata); } - configClass.addBeanRegistrar(metadata.getClassName(), registrar); + configClass.addBeanRegistrar(candidateClass.getName(), registrar); } else if (candidate.isAssignable(ImportBeanDefinitionRegistrar.class)) { // Candidate class is an ImportBeanDefinitionRegistrar -> diff --git a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorAotContributionTests.java b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorAotContributionTests.java index 2c1fe46a9d42..16d81e71d876 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorAotContributionTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorAotContributionTests.java @@ -511,7 +511,7 @@ void applyToWhenIsImportAware() { initializer.accept(freshContext); freshContext.refresh(); assertThat(freshContext.getBean(ClassNameHolder.class).className()) - .isEqualTo(ImportAwareBeanRegistrarConfiguration.class.getName()); + .isEqualTo(ImportAwareBeanRegistrar.class.getName()); freshContext.close(); }); } diff --git a/spring-context/src/test/kotlin/org/springframework/context/annotation/BeanRegistrarDslConfigurationTests.kt b/spring-context/src/test/kotlin/org/springframework/context/annotation/BeanRegistrarDslConfigurationTests.kt index 07b5ff71ba96..e90f13ef3189 100644 --- a/spring-context/src/test/kotlin/org/springframework/context/annotation/BeanRegistrarDslConfigurationTests.kt +++ b/spring-context/src/test/kotlin/org/springframework/context/annotation/BeanRegistrarDslConfigurationTests.kt @@ -24,6 +24,7 @@ import org.springframework.beans.factory.InitializingBean import org.springframework.beans.factory.NoSuchBeanDefinitionException import org.springframework.beans.factory.config.BeanDefinition import org.springframework.beans.factory.getBean +import org.springframework.beans.factory.getBeanProvider import org.springframework.beans.factory.support.RootBeanDefinition import org.springframework.mock.env.MockEnvironment import java.util.function.Supplier @@ -77,6 +78,13 @@ class BeanRegistrarDslConfigurationTests { assertThat(context.getBean().foo).isEqualTo(context.getBean()) } + @Test + fun multipleBeanRegistrar() { + val context = AnnotationConfigApplicationContext(MultipleBeanRegistrarKotlinConfiguration::class.java) + assertThat(context.getBeanProvider().singleOrNull()).isNotNull + assertThat(context.getBeanProvider().singleOrNull()).isNotNull + } + class Foo data class Bar(val foo: Foo) data class Baz(val message: String = "") @@ -90,6 +98,18 @@ class BeanRegistrarDslConfigurationTests { } + @Configuration + @Import(value = [FooRegistrar::class, BarRegistrar::class]) + internal class MultipleBeanRegistrarKotlinConfiguration + + private class FooRegistrar : BeanRegistrarDsl({ + registerBean() + }) + + private class BarRegistrar : BeanRegistrarDsl({ + registerBean() + }) + @Configuration @Import(SampleBeanRegistrar::class) internal class BeanRegistrarKotlinConfiguration