Skip to content

Commit bcf4c32

Browse files
committed
Call setAllowBeanDefinitionOverriding before initializer
Update initialization order in `SpringApplication` to ensure `setAllowBeanDefinitionOverriding` is called before initializiers. This prevents an initializer from accidentially overriding a bean. Closes gh-50264
1 parent 796b034 commit bcf4c32

2 files changed

Lines changed: 24 additions & 7 deletions

File tree

core/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,13 @@ private void prepareContext(DefaultBootstrapContext bootstrapContext, Configurab
383383
context.setEnvironment(environment);
384384
postProcessApplicationContext(context);
385385
addAotGeneratedInitializerIfNecessary(this.initializers);
386+
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
387+
if (beanFactory instanceof AbstractAutowireCapableBeanFactory autowireCapableBeanFactory) {
388+
autowireCapableBeanFactory.setAllowCircularReferences(this.properties.isAllowCircularReferences());
389+
if (beanFactory instanceof DefaultListableBeanFactory listableBeanFactory) {
390+
listableBeanFactory.setAllowBeanDefinitionOverriding(this.properties.isAllowBeanDefinitionOverriding());
391+
}
392+
}
386393
applyInitializers(context);
387394
listeners.contextPrepared(context);
388395
bootstrapContext.close(context);
@@ -391,17 +398,10 @@ private void prepareContext(DefaultBootstrapContext bootstrapContext, Configurab
391398
logStartupProfileInfo(context);
392399
}
393400
// Add boot specific singleton beans
394-
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
395401
beanFactory.registerSingleton("springApplicationArguments", applicationArguments);
396402
if (printedBanner != null) {
397403
beanFactory.registerSingleton("springBootBanner", printedBanner);
398404
}
399-
if (beanFactory instanceof AbstractAutowireCapableBeanFactory autowireCapableBeanFactory) {
400-
autowireCapableBeanFactory.setAllowCircularReferences(this.properties.isAllowCircularReferences());
401-
if (beanFactory instanceof DefaultListableBeanFactory listableBeanFactory) {
402-
listableBeanFactory.setAllowBeanDefinitionOverriding(this.properties.isAllowBeanDefinitionOverriding());
403-
}
404-
}
405405
if (this.properties.isLazyInitialization()) {
406406
context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor());
407407
}

core/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.springframework.beans.factory.BeanCreationException;
5050
import org.springframework.beans.factory.BeanCurrentlyInCreationException;
5151
import org.springframework.beans.factory.BeanDefinitionStoreException;
52+
import org.springframework.beans.factory.BeanRegistrar;
5253
import org.springframework.beans.factory.ObjectProvider;
5354
import org.springframework.beans.factory.UnsatisfiedDependencyException;
5455
import org.springframework.beans.factory.annotation.Autowired;
@@ -100,6 +101,7 @@
100101
import org.springframework.context.event.SimpleApplicationEventMulticaster;
101102
import org.springframework.context.event.SmartApplicationListener;
102103
import org.springframework.context.support.AbstractApplicationContext;
104+
import org.springframework.context.support.GenericApplicationContext;
103105
import org.springframework.context.support.StaticApplicationContext;
104106
import org.springframework.core.Ordered;
105107
import org.springframework.core.annotation.Order;
@@ -1139,6 +1141,21 @@ void beanDefinitionOverridingIsDisabledByDefault() {
11391141
.isThrownBy(() -> new SpringApplication(ExampleConfig.class, OverrideConfig.class).run());
11401142
}
11411143

1144+
@Test
1145+
void beanDefinitionOverridingIsAppliedToInitializer() { // gh-50264
1146+
assertThatExceptionOfType(BeanDefinitionOverrideException.class).isThrownBy(() -> {
1147+
BeanRegistrar registrar = (registry, env) -> {
1148+
registry.registerBean("someBean", String.class);
1149+
registry.registerBean("someBean", String.class);
1150+
};
1151+
ApplicationContextInitializer<GenericApplicationContext> initializer = (context) -> context
1152+
.register(registrar);
1153+
SpringApplication application = new SpringApplication(Example.class);
1154+
application.setInitializers(List.of(initializer));
1155+
application.run();
1156+
});
1157+
}
1158+
11421159
@Test
11431160
void beanDefinitionOverridingCanBeEnabled() {
11441161
assertThat(new SpringApplication(ExampleConfig.class, OverrideConfig.class)

0 commit comments

Comments
 (0)