Although default setting in Spring Boot for allowing bean overriding (spring.main.allow-bean-definition-overriding) is false, beans created with BeanRegistrar or GenericApplicationContext in initializer do no honor it.
So following will not fail:
fun main(args: Array<String>) {
SpringApplicationBuilder(ExampleApp::class.java)
.run {
initializers(
ApplicationContextInitializer<GenericApplicationContext> {
it.register(ExampleRegistrar())
}
)
build()
}
.run()
}
class ExampleApp
class ExampleRegistrar :
BeanRegistrarDsl({
registerBean("example") { ExampleBean() }
registerBean("example") { ExampleBean() }
})
class ExampleBean
same with beans registered using GenericApplicationContext, for example:
ApplicationContextInitializer<GenericApplicationContext> {
it.registerBean("example", ExampleBean::class.java, Supplier { ExampleBean() })
it.registerBean("example", ExampleBean::class.java, Supplier { ExampleBean() })
}
Setting setAllowBeanDefinitionOverriding to false in GenericApplicationContext will cause it to fail:
ApplicationContextInitializer<GenericApplicationContext> {
it.setAllowBeanDefinitionOverriding(false)
...
}
It will also fail when importing ExampleRegistrar using @Import annotation instead of register function in GenericApplicationContext:
@Import(ExampleRegistrar::class)
class ExampleApp
Spring Boot 4.0.3
Although default setting in Spring Boot for allowing bean overriding (
spring.main.allow-bean-definition-overriding) isfalse, beans created withBeanRegistrarorGenericApplicationContextin initializer do no honor it.So following will not fail:
same with beans registered using
GenericApplicationContext, for example:Setting
setAllowBeanDefinitionOverridingtofalseinGenericApplicationContextwill cause it to fail:It will also fail when importing
ExampleRegistrarusing@Importannotation instead ofregisterfunction inGenericApplicationContext:Spring Boot 4.0.3