Skip to content

Commit 6b1c2dc

Browse files
committed
Consistently override (and prevent overriding for) aliases with bean definitions
Closes gh-27866
1 parent e5af4aa commit 6b1c2dc

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionOverrideException.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2018 the original author or authors.
2+
* Copyright 2002-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -49,7 +49,7 @@ public BeanDefinitionOverrideException(
4949

5050
super(beanDefinition.getResourceDescription(), beanName,
5151
"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
52-
"': There is already [" + existingDefinition + "] bound.");
52+
"' since there is already [" + existingDefinition + "] bound.");
5353
this.beanDefinition = beanDefinition;
5454
this.existingDefinition = existingDefinition;
5555
}

spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,23 @@ else if (!beanDefinition.equals(existingDefinition)) {
994994
this.beanDefinitionMap.put(beanName, beanDefinition);
995995
}
996996
else {
997+
if (isAlias(beanName)) {
998+
if (!isAllowBeanDefinitionOverriding()) {
999+
String aliasedName = canonicalName(beanName);
1000+
if (containsBeanDefinition(aliasedName)) { // alias for existing bean definition
1001+
throw new BeanDefinitionOverrideException(
1002+
beanName, beanDefinition, getBeanDefinition(aliasedName));
1003+
}
1004+
else { // alias pointing to non-existing bean definition
1005+
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
1006+
"Cannot register bean definition for bean '" + beanName +
1007+
"' since there is already an alias for bean '" + aliasedName + "' bound.");
1008+
}
1009+
}
1010+
else {
1011+
removeAlias(beanName);
1012+
}
1013+
}
9971014
if (hasBeanCreationStarted()) {
9981015
// Cannot modify startup-time collection elements anymore (for stable iteration)
9991016
synchronized (this.beanDefinitionMap) {

spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,8 +854,11 @@ void beanDefinitionOverriding() {
854854
lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class));
855855
lbf.registerAlias("otherTest", "test2");
856856
lbf.registerAlias("test", "test2");
857+
lbf.registerAlias("test", "testX");
858+
lbf.registerBeanDefinition("testX", new RootBeanDefinition(TestBean.class));
857859
assertThat(lbf.getBean("test")).isInstanceOf(NestedTestBean.class);
858860
assertThat(lbf.getBean("test2")).isInstanceOf(NestedTestBean.class);
861+
assertThat(lbf.getBean("testX")).isInstanceOf(TestBean.class);
859862
}
860863

861864
@Test
@@ -864,13 +867,21 @@ void beanDefinitionOverridingNotAllowed() {
864867
BeanDefinition oldDef = new RootBeanDefinition(TestBean.class);
865868
BeanDefinition newDef = new RootBeanDefinition(NestedTestBean.class);
866869
lbf.registerBeanDefinition("test", oldDef);
870+
lbf.registerAlias("test", "testX");
867871
assertThatExceptionOfType(BeanDefinitionOverrideException.class).isThrownBy(() ->
868872
lbf.registerBeanDefinition("test", newDef))
869873
.satisfies(ex -> {
870874
assertThat(ex.getBeanName()).isEqualTo("test");
871875
assertThat(ex.getBeanDefinition()).isEqualTo(newDef);
872876
assertThat(ex.getExistingDefinition()).isEqualTo(oldDef);
873877
});
878+
assertThatExceptionOfType(BeanDefinitionOverrideException.class).isThrownBy(() ->
879+
lbf.registerBeanDefinition("testX", newDef))
880+
.satisfies(ex -> {
881+
assertThat(ex.getBeanName()).isEqualTo("testX");
882+
assertThat(ex.getBeanDefinition()).isEqualTo(newDef);
883+
assertThat(ex.getExistingDefinition()).isEqualTo(oldDef);
884+
});
874885
}
875886

876887
@Test

0 commit comments

Comments
 (0)