|
33 | 33 | import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
34 | 34 | import org.springframework.beans.factory.support.BeanNameGenerator;
|
35 | 35 | import org.springframework.beans.factory.support.DefaultBeanNameGenerator;
|
| 36 | +import org.springframework.beans.factory.support.DefaultListableBeanFactory; |
36 | 37 | import org.springframework.beans.factory.support.RootBeanDefinition;
|
37 | 38 | import org.springframework.core.Ordered;
|
38 | 39 | import org.springframework.core.ResolvableType;
|
@@ -142,14 +143,9 @@ else if (enforceExistingDefinition) {
|
142 | 143 | beanNameIncludingFactory = beanName;
|
143 | 144 | }
|
144 | 145 |
|
145 |
| - // Process existing bean definition. |
146 | 146 | if (existingBeanDefinition != null) {
|
| 147 | + // Validate existing bean definition. |
147 | 148 | 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); |
153 | 149 | }
|
154 | 150 | else {
|
155 | 151 | // There was no existing bean definition, so we register the pseudo bean definition
|
@@ -293,6 +289,13 @@ private static RootBeanDefinition createPseudoBeanDefinition(OverrideMetadata me
|
293 | 289 | private static void validateBeanDefinition(ConfigurableListableBeanFactory beanFactory, String beanName) {
|
294 | 290 | Assert.state(beanFactory.isSingleton(beanName),
|
295 | 291 | () -> "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 | + } |
296 | 299 | }
|
297 | 300 |
|
298 | 301 | }
|
0 commit comments