Skip to content

Commit 39a2725

Browse files
committed
Reduce scope of BeanDefinitionRegistry usage in Bean Override BFPP
1 parent f26a266 commit 39a2725

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.springframework.beans.factory.support.RootBeanDefinition;
3737
import org.springframework.core.Ordered;
3838
import org.springframework.core.ResolvableType;
39+
import org.springframework.lang.Nullable;
3940
import org.springframework.util.Assert;
4041

4142
/**
@@ -89,28 +90,26 @@ public int getOrder() {
8990

9091
@Override
9192
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
92-
if (!(beanFactory instanceof BeanDefinitionRegistry registry)) {
93-
throw new IllegalStateException("Cannot process bean override with a BeanFactory " +
94-
"that doesn't implement BeanDefinitionRegistry: " + beanFactory.getClass());
95-
}
96-
9793
for (OverrideMetadata metadata : this.metadata) {
98-
registerBeanOverride(beanFactory, registry, metadata);
94+
registerBeanOverride(beanFactory, metadata);
9995
}
10096
}
10197

102-
private void registerBeanOverride(ConfigurableListableBeanFactory beanFactory, BeanDefinitionRegistry registry,
103-
OverrideMetadata overrideMetadata) {
104-
98+
private void registerBeanOverride(ConfigurableListableBeanFactory beanFactory, OverrideMetadata overrideMetadata) {
10599
switch (overrideMetadata.getStrategy()) {
106-
case REPLACE_DEFINITION -> replaceDefinition(beanFactory, registry, overrideMetadata, true);
107-
case REPLACE_OR_CREATE_DEFINITION -> replaceDefinition(beanFactory, registry, overrideMetadata, false);
100+
case REPLACE_DEFINITION -> replaceDefinition(beanFactory, overrideMetadata, true);
101+
case REPLACE_OR_CREATE_DEFINITION -> replaceDefinition(beanFactory, overrideMetadata, false);
108102
case WRAP_BEAN -> wrapBean(beanFactory, overrideMetadata);
109103
}
110104
}
111105

112-
private void replaceDefinition(ConfigurableListableBeanFactory beanFactory, BeanDefinitionRegistry registry,
113-
OverrideMetadata overrideMetadata, boolean enforceExistingDefinition) {
106+
private void replaceDefinition(ConfigurableListableBeanFactory beanFactory, OverrideMetadata overrideMetadata,
107+
boolean enforceExistingDefinition) {
108+
109+
if (!(beanFactory instanceof BeanDefinitionRegistry registry)) {
110+
throw new IllegalStateException("Cannot process bean override with a BeanFactory " +
111+
"that doesn't implement BeanDefinitionRegistry: " + beanFactory.getClass());
112+
}
114113

115114
// The following is a "pseudo" bean definition which MUST NOT be used to
116115
// create an actual bean instance.
@@ -120,9 +119,12 @@ private void replaceDefinition(ConfigurableListableBeanFactory beanFactory, Bean
120119
BeanDefinition existingBeanDefinition = null;
121120
if (beanName == null) {
122121
beanNameIncludingFactory = getBeanNameForType(
123-
beanFactory, registry, overrideMetadata, pseudoBeanDefinition, enforceExistingDefinition);
122+
beanFactory, overrideMetadata, pseudoBeanDefinition, enforceExistingDefinition);
123+
if (beanNameIncludingFactory == null) {
124+
beanNameIncludingFactory = beanNameGenerator.generateBeanName(pseudoBeanDefinition, registry);
125+
}
124126
beanName = BeanFactoryUtils.transformedBeanName(beanNameIncludingFactory);
125-
if (registry.containsBeanDefinition(beanName)) {
127+
if (beanFactory.containsBeanDefinition(beanName)) {
126128
existingBeanDefinition = beanFactory.getBeanDefinition(beanName);
127129
}
128130
}
@@ -200,8 +202,9 @@ private void wrapBean(ConfigurableListableBeanFactory beanFactory, OverrideMetad
200202
this.overrideRegistrar.registerNameForMetadata(overrideMetadata, beanName);
201203
}
202204

203-
private String getBeanNameForType(ConfigurableListableBeanFactory beanFactory, BeanDefinitionRegistry registry,
204-
OverrideMetadata overrideMetadata, RootBeanDefinition beanDefinition, boolean enforceExistingDefinition) {
205+
@Nullable
206+
private String getBeanNameForType(ConfigurableListableBeanFactory beanFactory, OverrideMetadata overrideMetadata,
207+
RootBeanDefinition beanDefinition, boolean enforceExistingDefinition) {
205208

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

221224
Field field = overrideMetadata.getField();

0 commit comments

Comments
 (0)