diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java index 8d0866b9b159..d6603e3fad6c 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java @@ -104,19 +104,6 @@ private void postProcessWithRegistry(ConfigurableListableBeanFactory beanFactory } } - /** - * Copy certain details of a {@link BeanDefinition} to the definition created by - * this processor for a given {@link OverrideMetadata}. - *
The default implementation copies the {@linkplain BeanDefinition#isPrimary()
- * primary flag}, @{@linkplain BeanDefinition#isFallback() fallback flag}
- * and the {@linkplain BeanDefinition#getScope() scope}.
- */
- protected void copyBeanDefinitionDetails(BeanDefinition from, RootBeanDefinition to) {
- to.setPrimary(from.isPrimary());
- to.setFallback(from.isFallback());
- to.setScope(from.getScope());
- }
-
private void registerBeanOverride(ConfigurableListableBeanFactory beanFactory, BeanDefinitionRegistry registry,
OverrideMetadata overrideMetadata) {
@@ -132,6 +119,8 @@ private void registerBeanOverride(ConfigurableListableBeanFactory beanFactory, B
private void registerReplaceDefinition(ConfigurableListableBeanFactory beanFactory, BeanDefinitionRegistry registry,
OverrideMetadata overrideMetadata, boolean enforceExistingDefinition) {
+ // The following is a "dummy" bean definition which should not be used to
+ // create an actual bean instance.
RootBeanDefinition beanDefinition = createBeanDefinition(overrideMetadata);
String beanName = overrideMetadata.getBeanName();
String beanNameIncludingFactory;
@@ -157,22 +146,27 @@ else if (enforceExistingDefinition) {
beanNameIncludingFactory = beanName;
}
+ // Process existing bean definition.
if (existingBeanDefinition != null) {
- copyBeanDefinitionDetails(existingBeanDefinition, beanDefinition);
+ copyBeanDefinitionProperties(existingBeanDefinition, beanDefinition);
registry.removeBeanDefinition(beanName);
}
+
+ // At this point, we either removed an existing bean definition above, or
+ // there was no bean definition to begin with. So, we register the dummy bean
+ // definition to ensure that a bean definition exists for the given bean name.
registry.registerBeanDefinition(beanName, beanDefinition);
Object override = overrideMetadata.createOverride(beanName, existingBeanDefinition, null);
+ overrideMetadata.track(override, beanFactory);
+ this.overrideRegistrar.registerNameForMetadata(overrideMetadata, beanNameIncludingFactory);
+
if (beanFactory.isSingleton(beanNameIncludingFactory)) {
- // Now we have an instance (the override) that we can register.
- // At this stage we don't expect a singleton instance to be present,
- // and this call will throw if there is such an instance already.
+ // Now we have an instance (the override) that we can register. At this
+ // stage we don't expect a singleton instance to be present, and this call
+ // will throw an exception if there is such an instance already.
beanFactory.registerSingleton(beanName, override);
}
-
- overrideMetadata.track(override, beanFactory);
- this.overrideRegistrar.registerNameForMetadata(overrideMetadata, beanNameIncludingFactory);
}
private String getBeanNameForType(ConfigurableListableBeanFactory beanFactory, BeanDefinitionRegistry registry,
@@ -231,13 +225,6 @@ private void registerWrapBean(ConfigurableListableBeanFactory beanFactory, Overr
this.overrideRegistrar.registerNameForMetadata(metadata, beanName);
}
- RootBeanDefinition createBeanDefinition(OverrideMetadata metadata) {
- RootBeanDefinition definition = new RootBeanDefinition(metadata.getBeanType().resolve());
- definition.setTargetType(metadata.getBeanType());
- definition.setQualifiedElement(metadata.getField());
- return definition;
- }
-
private Set