diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ClassPathBeanDefinitionScanner.java b/spring-context/src/main/java/org/springframework/context/annotation/ClassPathBeanDefinitionScanner.java index bf299013bd5..7aa22b2eb7a 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ClassPathBeanDefinitionScanner.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ClassPathBeanDefinitionScanner.java @@ -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; } diff --git a/spring-context/src/test/java/org/springframework/context/annotation/ClassPathBeanDefinitionScannerTests.java b/spring-context/src/test/java/org/springframework/context/annotation/ClassPathBeanDefinitionScannerTests.java index c0b9d2d907d..1dd5ea0077e 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/ClassPathBeanDefinitionScannerTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/ClassPathBeanDefinitionScannerTests.java @@ -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();