From e685ff0416f03243d1eae900f080b26caaefd449 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 16 Aug 2023 18:46:32 +0200 Subject: [PATCH] Always accept existing explicit definition for same class name See gh-25952 --- .../annotation/ClassPathBeanDefinitionScanner.java | 4 +++- .../ClassPathBeanDefinitionScannerTests.java | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) 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 bf299013bd..7aa22b2eb7 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 c0b9d2d907..1dd5ea0077 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();