Skip to content

Commit 8ae4bc1

Browse files
committed
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 fromm the same Configuration class fixes #35652
1 parent 22ecab5 commit 8ae4bc1

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ else if (candidate.isAssignable(BeanRegistrar.class)) {
615615
if (registrar instanceof ImportAware importAware) {
616616
importAware.setImportMetadata(metadata);
617617
}
618-
configClass.addBeanRegistrar(metadata.getClassName(), registrar);
618+
configClass.addBeanRegistrar(candidateClass.getName(), registrar);
619619
}
620620
else if (candidate.isAssignable(ImportBeanDefinitionRegistrar.class)) {
621621
// Candidate class is an ImportBeanDefinitionRegistrar ->

spring-context/src/test/kotlin/org/springframework/context/annotation/BeanRegistrarDslConfigurationTests.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.springframework.beans.factory.InitializingBean
2424
import org.springframework.beans.factory.NoSuchBeanDefinitionException
2525
import org.springframework.beans.factory.config.BeanDefinition
2626
import org.springframework.beans.factory.getBean
27+
import org.springframework.beans.factory.getBeanProvider
2728
import org.springframework.beans.factory.support.RootBeanDefinition
2829
import org.springframework.mock.env.MockEnvironment
2930
import java.util.function.Supplier
@@ -77,6 +78,13 @@ class BeanRegistrarDslConfigurationTests {
7778
assertThat(context.getBean<Bar>().foo).isEqualTo(context.getBean<Foo>())
7879
}
7980

81+
@Test
82+
fun multipleBeanRegistrar() {
83+
val context = AnnotationConfigApplicationContext(MultipleBeanRegistrarKotlinConfiguration::class.java)
84+
assertThat(context.getBeanProvider<Foo>().singleOrNull()).isNotNull
85+
assertThat(context.getBeanProvider<Bar>().singleOrNull()).isNotNull
86+
}
87+
8088
class Foo
8189
data class Bar(val foo: Foo)
8290
data class Baz(val message: String = "")
@@ -90,6 +98,18 @@ class BeanRegistrarDslConfigurationTests {
9098

9199
}
92100

101+
@Configuration
102+
@Import(value = [FooRegistrar::class, BarRegistrar::class])
103+
internal class MultipleBeanRegistrarKotlinConfiguration
104+
105+
private class FooRegistrar : BeanRegistrarDsl({
106+
registerBean<Foo>()
107+
})
108+
109+
private class BarRegistrar : BeanRegistrarDsl({
110+
registerBean<Bar>()
111+
})
112+
93113
@Configuration
94114
@Import(SampleBeanRegistrar::class)
95115
internal class BeanRegistrarKotlinConfiguration

0 commit comments

Comments
 (0)