From 02094b258c15e72d7d4c94b58ed4d0b743b6181a Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Thu, 3 Oct 2024 16:39:10 +0200 Subject: [PATCH] Destroy singleton instead of removing and re-registering bean definition --- .../BeanOverrideBeanFactoryPostProcessor.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) 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 1fe3bbb96f39..ccd41df7817d 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 @@ -33,6 +33,7 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.support.DefaultBeanNameGenerator; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.core.Ordered; import org.springframework.core.ResolvableType; @@ -142,14 +143,9 @@ else if (enforceExistingDefinition) { beanNameIncludingFactory = beanName; } - // Process existing bean definition. if (existingBeanDefinition != null) { + // Validate existing bean definition. validateBeanDefinition(beanFactory, beanName); - // Since validation may have registered a singleton as a side effect -- for example, - // for a FactoryBean -- we need to remove the bean definition (which removes the - // singleton as a side effect) and re-register the bean definition. - registry.removeBeanDefinition(beanName); - registry.registerBeanDefinition(beanName, existingBeanDefinition); } else { // There was no existing bean definition, so we register the pseudo bean definition @@ -293,6 +289,13 @@ private static RootBeanDefinition createPseudoBeanDefinition(OverrideMetadata me private static void validateBeanDefinition(ConfigurableListableBeanFactory beanFactory, String beanName) { Assert.state(beanFactory.isSingleton(beanName), () -> "Unable to override bean '" + beanName + "': only singleton beans can be overridden."); + + // Since the isSingleton() check above may have registered a singleton as a side + // effect -- for example, for a FactoryBean -- we need to destroy the singleton, + // because we later manually register a bean override instance as a singleton. + if (beanFactory instanceof DefaultListableBeanFactory dlbf) { + dlbf.destroySingleton(beanName); + } } }