Skip to content

Commit

Permalink
Reduce scope of BeanDefinitionRegistry usage in Bean Override BFPP
Browse files Browse the repository at this point in the history
  • Loading branch information
sbrannen committed Oct 3, 2024
1 parent f26a266 commit 39a2725
Showing 1 changed file with 21 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.core.Ordered;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

/**
Expand Down Expand Up @@ -89,28 +90,26 @@ public int getOrder() {

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
if (!(beanFactory instanceof BeanDefinitionRegistry registry)) {
throw new IllegalStateException("Cannot process bean override with a BeanFactory " +
"that doesn't implement BeanDefinitionRegistry: " + beanFactory.getClass());
}

for (OverrideMetadata metadata : this.metadata) {
registerBeanOverride(beanFactory, registry, metadata);
registerBeanOverride(beanFactory, metadata);
}
}

private void registerBeanOverride(ConfigurableListableBeanFactory beanFactory, BeanDefinitionRegistry registry,
OverrideMetadata overrideMetadata) {

private void registerBeanOverride(ConfigurableListableBeanFactory beanFactory, OverrideMetadata overrideMetadata) {
switch (overrideMetadata.getStrategy()) {
case REPLACE_DEFINITION -> replaceDefinition(beanFactory, registry, overrideMetadata, true);
case REPLACE_OR_CREATE_DEFINITION -> replaceDefinition(beanFactory, registry, overrideMetadata, false);
case REPLACE_DEFINITION -> replaceDefinition(beanFactory, overrideMetadata, true);
case REPLACE_OR_CREATE_DEFINITION -> replaceDefinition(beanFactory, overrideMetadata, false);
case WRAP_BEAN -> wrapBean(beanFactory, overrideMetadata);
}
}

private void replaceDefinition(ConfigurableListableBeanFactory beanFactory, BeanDefinitionRegistry registry,
OverrideMetadata overrideMetadata, boolean enforceExistingDefinition) {
private void replaceDefinition(ConfigurableListableBeanFactory beanFactory, OverrideMetadata overrideMetadata,
boolean enforceExistingDefinition) {

if (!(beanFactory instanceof BeanDefinitionRegistry registry)) {
throw new IllegalStateException("Cannot process bean override with a BeanFactory " +
"that doesn't implement BeanDefinitionRegistry: " + beanFactory.getClass());
}

// The following is a "pseudo" bean definition which MUST NOT be used to
// create an actual bean instance.
Expand All @@ -120,9 +119,12 @@ private void replaceDefinition(ConfigurableListableBeanFactory beanFactory, Bean
BeanDefinition existingBeanDefinition = null;
if (beanName == null) {
beanNameIncludingFactory = getBeanNameForType(
beanFactory, registry, overrideMetadata, pseudoBeanDefinition, enforceExistingDefinition);
beanFactory, overrideMetadata, pseudoBeanDefinition, enforceExistingDefinition);
if (beanNameIncludingFactory == null) {
beanNameIncludingFactory = beanNameGenerator.generateBeanName(pseudoBeanDefinition, registry);
}
beanName = BeanFactoryUtils.transformedBeanName(beanNameIncludingFactory);
if (registry.containsBeanDefinition(beanName)) {
if (beanFactory.containsBeanDefinition(beanName)) {
existingBeanDefinition = beanFactory.getBeanDefinition(beanName);
}
}
Expand Down Expand Up @@ -200,8 +202,9 @@ private void wrapBean(ConfigurableListableBeanFactory beanFactory, OverrideMetad
this.overrideRegistrar.registerNameForMetadata(overrideMetadata, beanName);
}

private String getBeanNameForType(ConfigurableListableBeanFactory beanFactory, BeanDefinitionRegistry registry,
OverrideMetadata overrideMetadata, RootBeanDefinition beanDefinition, boolean enforceExistingDefinition) {
@Nullable
private String getBeanNameForType(ConfigurableListableBeanFactory beanFactory, OverrideMetadata overrideMetadata,
RootBeanDefinition beanDefinition, boolean enforceExistingDefinition) {

Set<String> candidateNames = getExistingBeanNamesByType(beanFactory, overrideMetadata, true);
int candidateCount = candidateNames.size();
Expand All @@ -215,7 +218,7 @@ else if (candidateCount == 0) {
"Unable to override bean: no bean definitions of type %s (as required by annotated field '%s.%s')"
.formatted(overrideMetadata.getBeanType(), field.getDeclaringClass().getSimpleName(), field.getName()));
}
return beanNameGenerator.generateBeanName(beanDefinition, registry);
return null;
}

Field field = overrideMetadata.getField();
Expand Down

0 comments on commit 39a2725

Please sign in to comment.