Skip to content

Commit 331f62f

Browse files
committed
Merge branch '6.2.x'
# Conflicts: # framework-platform/framework-platform.gradle # spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
2 parents a78554e + f4438ce commit 331f62f

File tree

4 files changed

+92
-4
lines changed

4 files changed

+92
-4
lines changed

spring-aop/src/main/java/org/springframework/aop/scope/ScopedProxyUtils.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,19 @@ public static BeanDefinitionHolder createScopedProxy(BeanDefinitionHolder defini
8282
// Copy autowire settings from original bean definition.
8383
proxyDefinition.setAutowireCandidate(targetDefinition.isAutowireCandidate());
8484
proxyDefinition.setPrimary(targetDefinition.isPrimary());
85+
proxyDefinition.setFallback(targetDefinition.isFallback());
8586
if (targetDefinition instanceof AbstractBeanDefinition abd) {
87+
proxyDefinition.setDefaultCandidate(abd.isDefaultCandidate());
8688
proxyDefinition.copyQualifiersFrom(abd);
8789
}
8890

8991
// The target bean should be ignored in favor of the scoped proxy.
9092
targetDefinition.setAutowireCandidate(false);
9193
targetDefinition.setPrimary(false);
94+
targetDefinition.setFallback(false);
95+
if (targetDefinition instanceof AbstractBeanDefinition abd) {
96+
abd.setDefaultCandidate(false);
97+
}
9298

9399
// Register the target bean as separate bean in the factory.
94100
registry.registerBeanDefinition(targetBeanName, targetDefinition);

spring-aop/src/test/java/org/springframework/aop/scope/ScopedProxyUtilsTests.java

Lines changed: 78 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,23 @@
1818

1919
import org.junit.jupiter.api.Test;
2020

21+
import org.springframework.beans.factory.config.BeanDefinition;
22+
import org.springframework.beans.factory.config.BeanDefinitionHolder;
23+
import org.springframework.beans.factory.support.AbstractBeanDefinition;
24+
import org.springframework.beans.factory.support.AutowireCandidateQualifier;
25+
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
26+
import org.springframework.beans.factory.support.GenericBeanDefinition;
27+
import org.springframework.beans.factory.support.RootBeanDefinition;
28+
import org.springframework.beans.factory.support.SimpleBeanDefinitionRegistry;
29+
2130
import static org.assertj.core.api.Assertions.assertThat;
2231
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
2332

2433
/**
2534
* Tests for {@link ScopedProxyUtils}.
2635
*
2736
* @author Sam Brannen
37+
* @author Juergen Hoeller
2838
* @since 5.1.10
2939
*/
3040
class ScopedProxyUtilsTests {
@@ -53,15 +63,79 @@ void getOriginalBeanNameAndIsScopedTarget() {
5363
@Test
5464
void getOriginalBeanNameForNullTargetBean() {
5565
assertThatIllegalArgumentException()
56-
.isThrownBy(() -> ScopedProxyUtils.getOriginalBeanName(null))
57-
.withMessage("bean name 'null' does not refer to the target of a scoped proxy");
66+
.isThrownBy(() -> ScopedProxyUtils.getOriginalBeanName(null))
67+
.withMessage("bean name 'null' does not refer to the target of a scoped proxy");
5868
}
5969

6070
@Test
6171
void getOriginalBeanNameForNonScopedTarget() {
6272
assertThatIllegalArgumentException()
63-
.isThrownBy(() -> ScopedProxyUtils.getOriginalBeanName("myBean"))
64-
.withMessage("bean name 'myBean' does not refer to the target of a scoped proxy");
73+
.isThrownBy(() -> ScopedProxyUtils.getOriginalBeanName("myBean"))
74+
.withMessage("bean name 'myBean' does not refer to the target of a scoped proxy");
75+
}
76+
77+
@Test
78+
void createScopedProxyTargetAppliesAutowireSettingsToProxyBeanDefinition() {
79+
AbstractBeanDefinition targetDefinition = new GenericBeanDefinition();
80+
// Opposite of defaults
81+
targetDefinition.setAutowireCandidate(false);
82+
targetDefinition.setDefaultCandidate(false);
83+
targetDefinition.setPrimary(true);
84+
targetDefinition.setFallback(true);
85+
86+
BeanDefinitionRegistry registry = new SimpleBeanDefinitionRegistry();
87+
BeanDefinitionHolder proxyHolder = ScopedProxyUtils.createScopedProxy(
88+
new BeanDefinitionHolder(targetDefinition, "myBean"), registry, false);
89+
AbstractBeanDefinition proxyBeanDefinition = (AbstractBeanDefinition) proxyHolder.getBeanDefinition();
90+
91+
assertThat(proxyBeanDefinition.isAutowireCandidate()).isFalse();
92+
assertThat(proxyBeanDefinition.isDefaultCandidate()).isFalse();
93+
assertThat(proxyBeanDefinition.isPrimary()).isTrue();
94+
assertThat(proxyBeanDefinition.isFallback()).isTrue();
95+
}
96+
97+
@Test
98+
void createScopedProxyTargetAppliesBeanAttributesToProxyBeanDefinition() {
99+
GenericBeanDefinition targetDefinition = new GenericBeanDefinition();
100+
// Opposite of defaults
101+
targetDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
102+
targetDefinition.setSource("theSource");
103+
targetDefinition.addQualifier(new AutowireCandidateQualifier("myQualifier"));
104+
105+
BeanDefinitionRegistry registry = new SimpleBeanDefinitionRegistry();
106+
BeanDefinitionHolder proxyHolder = ScopedProxyUtils.createScopedProxy(
107+
new BeanDefinitionHolder(targetDefinition, "myBean"), registry, false);
108+
BeanDefinition proxyBeanDefinition = proxyHolder.getBeanDefinition();
109+
110+
assertThat(proxyBeanDefinition.getRole()).isEqualTo(BeanDefinition.ROLE_INFRASTRUCTURE);
111+
assertThat(proxyBeanDefinition).isInstanceOf(RootBeanDefinition.class);
112+
assertThat(proxyBeanDefinition.getPropertyValues()).hasSize(2);
113+
assertThat(proxyBeanDefinition.getPropertyValues().get("proxyTargetClass")).isEqualTo(false);
114+
assertThat(proxyBeanDefinition.getPropertyValues().get("targetBeanName")).isEqualTo(
115+
ScopedProxyUtils.getTargetBeanName("myBean"));
116+
117+
RootBeanDefinition rootBeanDefinition = (RootBeanDefinition) proxyBeanDefinition;
118+
assertThat(rootBeanDefinition.getQualifiers()).hasSize(1);
119+
assertThat(rootBeanDefinition.hasQualifier("myQualifier")).isTrue();
120+
assertThat(rootBeanDefinition.getSource()).isEqualTo("theSource");
121+
}
122+
123+
@Test
124+
void createScopedProxyTargetCleansAutowireSettingsInTargetDefinition() {
125+
AbstractBeanDefinition targetDefinition = new GenericBeanDefinition();
126+
targetDefinition.setAutowireCandidate(true);
127+
targetDefinition.setDefaultCandidate(true);
128+
targetDefinition.setPrimary(true);
129+
targetDefinition.setFallback(true);
130+
131+
BeanDefinitionRegistry registry = new SimpleBeanDefinitionRegistry();
132+
ScopedProxyUtils.createScopedProxy(
133+
new BeanDefinitionHolder(targetDefinition, "myBean"), registry, false);
134+
135+
assertThat(targetDefinition.isAutowireCandidate()).isFalse();
136+
assertThat(targetDefinition.isDefaultCandidate()).isFalse();
137+
assertThat(targetDefinition.isPrimary()).isFalse();
138+
assertThat(targetDefinition.isFallback()).isFalse();
65139
}
66140

67141
}

spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,7 +1477,10 @@ protected void addSingleton(String beanName, Object singletonObject) {
14771477
@Override
14781478
public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException {
14791479
super.registerSingleton(beanName, singletonObject);
1480+
14801481
updateManualSingletonNames(set -> set.add(beanName), set -> !this.beanDefinitionMap.containsKey(beanName));
1482+
this.allBeanNamesByType.remove(Object.class);
1483+
this.singletonBeanNamesByType.remove(Object.class);
14811484
}
14821485

14831486
@Override

spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
import org.springframework.core.io.Resource;
8888
import org.springframework.core.io.UrlResource;
8989
import org.springframework.core.testfixture.io.SerializationTestUtils;
90+
import org.springframework.util.StringUtils;
9091
import org.springframework.util.StringValueResolver;
9192

9293
import static org.assertj.core.api.Assertions.assertThat;
@@ -3232,6 +3233,10 @@ void mostSpecificCacheEntryForTypeMatching() {
32323233
assertThat(lbf.getBeanNamesForType(DerivedTestBean.class)).containsExactly("bd1");
32333234
assertThat(lbf.getBeanNamesForType(NestedTestBean.class)).isSameAs(nestedBeanNames);
32343235
assertThat(lbf.getBeanNamesForType(Object.class)).isSameAs(allBeanNames);
3236+
3237+
lbf.registerSingleton("bd3", new Object());
3238+
assertThat(lbf.getBeanNamesForType(NestedTestBean.class)).isSameAs(nestedBeanNames);
3239+
assertThat(lbf.getBeanNamesForType(Object.class)).containsExactly(StringUtils.addStringToArray(allBeanNames, "bd3"));
32353240
}
32363241

32373242

0 commit comments

Comments
 (0)