Skip to content

Commit 02094b2

Browse files
committed
Destroy singleton instead of removing and re-registering bean definition
1 parent 39a2725 commit 02094b2

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
3434
import org.springframework.beans.factory.support.BeanNameGenerator;
3535
import org.springframework.beans.factory.support.DefaultBeanNameGenerator;
36+
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
3637
import org.springframework.beans.factory.support.RootBeanDefinition;
3738
import org.springframework.core.Ordered;
3839
import org.springframework.core.ResolvableType;
@@ -142,14 +143,9 @@ else if (enforceExistingDefinition) {
142143
beanNameIncludingFactory = beanName;
143144
}
144145

145-
// Process existing bean definition.
146146
if (existingBeanDefinition != null) {
147+
// Validate existing bean definition.
147148
validateBeanDefinition(beanFactory, beanName);
148-
// Since validation may have registered a singleton as a side effect -- for example,
149-
// for a FactoryBean -- we need to remove the bean definition (which removes the
150-
// singleton as a side effect) and re-register the bean definition.
151-
registry.removeBeanDefinition(beanName);
152-
registry.registerBeanDefinition(beanName, existingBeanDefinition);
153149
}
154150
else {
155151
// There was no existing bean definition, so we register the pseudo bean definition
@@ -293,6 +289,13 @@ private static RootBeanDefinition createPseudoBeanDefinition(OverrideMetadata me
293289
private static void validateBeanDefinition(ConfigurableListableBeanFactory beanFactory, String beanName) {
294290
Assert.state(beanFactory.isSingleton(beanName),
295291
() -> "Unable to override bean '" + beanName + "': only singleton beans can be overridden.");
292+
293+
// Since the isSingleton() check above may have registered a singleton as a side
294+
// effect -- for example, for a FactoryBean -- we need to destroy the singleton,
295+
// because we later manually register a bean override instance as a singleton.
296+
if (beanFactory instanceof DefaultListableBeanFactory dlbf) {
297+
dlbf.destroySingleton(beanName);
298+
}
296299
}
297300

298301
}

0 commit comments

Comments
 (0)