Browse Source

Always accept existing explicit definition for same class name

See gh-25952
pull/31063/head
Juergen Hoeller 2 years ago
parent
commit
e685ff0416
  1. 4
      spring-context/src/main/java/org/springframework/context/annotation/ClassPathBeanDefinitionScanner.java
  2. 12
      spring-context/src/test/java/org/springframework/context/annotation/ClassPathBeanDefinitionScannerTests.java

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

@ -33,6 +33,7 @@ import org.springframework.core.env.StandardEnvironment; @@ -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 @@ -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;
}

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

@ -215,6 +215,18 @@ public class ClassPathBeanDefinitionScannerTests { @@ -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();

Loading…
Cancel
Save