Always accept existing explicit definition for same class name

See gh-25952
This commit is contained in:
Juergen Hoeller 2023-08-16 18:46:32 +02:00
parent 4bfbf7d3c8
commit e685ff0416
2 changed files with 15 additions and 1 deletions

View File

@ -33,6 +33,7 @@ import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.util.PatternMatchUtils;
/**
@ -345,7 +346,8 @@ public class ClassPathBeanDefinitionScanner extends ClassPathScanningCandidateCo
// Explicitly registered overriding bean?
if (!(existingDef instanceof ScannedGenericBeanDefinition) &&
this.registry.isBeanDefinitionOverridable(beanName)) {
(this.registry.isBeanDefinitionOverridable(beanName) || ObjectUtils.nullSafeEquals(
beanDefinition.getBeanClassName(), existingDef.getBeanClassName()))) {
return false;
}

View File

@ -215,6 +215,18 @@ public class ClassPathBeanDefinitionScannerTests {
.withMessageContaining(StubFooDao.class.getName());
}
@Test
public void testSimpleScanWithDefaultFiltersAndOverridingBeanAcceptedForSameBeanClass() {
GenericApplicationContext context = new GenericApplicationContext();
context.getDefaultListableBeanFactory().setAllowBeanDefinitionOverriding(false);
context.registerBeanDefinition("stubFooDao", new RootBeanDefinition(StubFooDao.class));
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
scanner.setIncludeAnnotationConfig(false);
// should not fail!
scanner.scan(BASE_PACKAGE);
}
@Test
public void testSimpleScanWithDefaultFiltersAndDefaultBeanNameClash() {
GenericApplicationContext context = new GenericApplicationContext();