Skip to content

Commit

Permalink
Destroy singleton instead of removing and re-registering bean definition
Browse files Browse the repository at this point in the history
  • Loading branch information
sbrannen committed Oct 3, 2024
1 parent 39a2725 commit 02094b2
Showing 1 changed file with 9 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
}

}

0 comments on commit 02094b2

Please sign in to comment.