Skip to content

Commit e685ff0

Browse files
committed
Always accept existing explicit definition for same class name
See gh-25952
1 parent 4bfbf7d commit e685ff0

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.core.io.ResourceLoader;
3434
import org.springframework.lang.Nullable;
3535
import org.springframework.util.Assert;
36+
import org.springframework.util.ObjectUtils;
3637
import org.springframework.util.PatternMatchUtils;
3738

3839
/**
@@ -345,7 +346,8 @@ protected boolean checkCandidate(String beanName, BeanDefinition beanDefinition)
345346

346347
// Explicitly registered overriding bean?
347348
if (!(existingDef instanceof ScannedGenericBeanDefinition) &&
348-
this.registry.isBeanDefinitionOverridable(beanName)) {
349+
(this.registry.isBeanDefinitionOverridable(beanName) || ObjectUtils.nullSafeEquals(
350+
beanDefinition.getBeanClassName(), existingDef.getBeanClassName()))) {
349351
return false;
350352
}
351353

spring-context/src/test/java/org/springframework/context/annotation/ClassPathBeanDefinitionScannerTests.java

+12
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,18 @@ public void testSimpleScanWithDefaultFiltersAndOverridingBeanNotAllowed() {
215215
.withMessageContaining(StubFooDao.class.getName());
216216
}
217217

218+
@Test
219+
public void testSimpleScanWithDefaultFiltersAndOverridingBeanAcceptedForSameBeanClass() {
220+
GenericApplicationContext context = new GenericApplicationContext();
221+
context.getDefaultListableBeanFactory().setAllowBeanDefinitionOverriding(false);
222+
context.registerBeanDefinition("stubFooDao", new RootBeanDefinition(StubFooDao.class));
223+
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
224+
scanner.setIncludeAnnotationConfig(false);
225+
226+
// should not fail!
227+
scanner.scan(BASE_PACKAGE);
228+
}
229+
218230
@Test
219231
public void testSimpleScanWithDefaultFiltersAndDefaultBeanNameClash() {
220232
GenericApplicationContext context = new GenericApplicationContext();

0 commit comments

Comments
 (0)