Polish BeanOverrideBeanFactoryPostProcessor

This commit is contained in:
Sam Brannen 2024-10-07 14:22:53 +02:00
parent c10a7f300c
commit 98bee41630
1 changed files with 14 additions and 10 deletions

View File

@ -76,9 +76,7 @@ class BeanOverrideBeanFactoryPostProcessor implements BeanFactoryPostProcessor,
* @param overrideRegistrar the {@code BeanOverrideRegistrar} used to track * @param overrideRegistrar the {@code BeanOverrideRegistrar} used to track
* metadata * metadata
*/ */
public BeanOverrideBeanFactoryPostProcessor(Set<OverrideMetadata> metadata, BeanOverrideBeanFactoryPostProcessor(Set<OverrideMetadata> metadata, BeanOverrideRegistrar overrideRegistrar) {
BeanOverrideRegistrar overrideRegistrar) {
this.metadata = metadata; this.metadata = metadata;
this.overrideRegistrar = overrideRegistrar; this.overrideRegistrar = overrideRegistrar;
} }
@ -113,18 +111,23 @@ class BeanOverrideBeanFactoryPostProcessor implements BeanFactoryPostProcessor,
} }
// The following is a "pseudo" bean definition which MUST NOT be used to // The following is a "pseudo" bean definition which MUST NOT be used to
// create an actual bean instance. // create an actual bean instance. In fact, it is only used as a placeholder
// to support overrides for nonexistent beans.
RootBeanDefinition pseudoBeanDefinition = createPseudoBeanDefinition(overrideMetadata); RootBeanDefinition pseudoBeanDefinition = createPseudoBeanDefinition(overrideMetadata);
String beanName = overrideMetadata.getBeanName(); String beanName = overrideMetadata.getBeanName();
String beanNameIncludingFactory; String beanNameIncludingFactory;
BeanDefinition existingBeanDefinition = null; BeanDefinition existingBeanDefinition = null;
if (beanName == null) { if (beanName == null) {
beanNameIncludingFactory = getBeanNameForType(beanFactory, overrideMetadata, enforceExistingDefinition); beanNameIncludingFactory = getBeanNameForType(beanFactory, overrideMetadata, enforceExistingDefinition);
if (beanNameIncludingFactory == null) { if (beanNameIncludingFactory == null) {
beanNameIncludingFactory = beanNameGenerator.generateBeanName(pseudoBeanDefinition, registry); // We need to generate a name for a nonexistent bean.
beanName = beanNameGenerator.generateBeanName(pseudoBeanDefinition, registry);
beanNameIncludingFactory = beanName;
} }
beanName = BeanFactoryUtils.transformedBeanName(beanNameIncludingFactory); else {
if (beanFactory.containsBeanDefinition(beanName)) { // We are overriding an existing bean.
beanName = BeanFactoryUtils.transformedBeanName(beanNameIncludingFactory);
existingBeanDefinition = beanFactory.getBeanDefinition(beanName); existingBeanDefinition = beanFactory.getBeanDefinition(beanName);
} }
} }
@ -143,12 +146,13 @@ class BeanOverrideBeanFactoryPostProcessor implements BeanFactoryPostProcessor,
} }
if (existingBeanDefinition != null) { if (existingBeanDefinition != null) {
// Validate existing bean definition. // Validate the existing bean definition.
validateBeanDefinition(beanFactory, beanName); validateBeanDefinition(beanFactory, beanName);
} }
else { else {
// There was no existing bean definition, so we register the pseudo bean definition // There was no existing bean definition, so we register the "pseudo" bean
// to ensure that a bean definition exists for the given bean name. // definition to ensure that a suitable bean definition exists for the given
// bean name for proper autowiring candidate resolution.
registry.registerBeanDefinition(beanName, pseudoBeanDefinition); registry.registerBeanDefinition(beanName, pseudoBeanDefinition);
} }