Skip to content

Commit df67c1c

Browse files
Schäfer, H.H. (Hans Hosea)jhoeller
authored andcommitted
35626: defaultCandidate for scoped proxies
Signed-off-by: Schäfer, H.H. (Hans Hosea) <[email protected]>
1 parent 05814f7 commit df67c1c

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,15 @@ public static BeanDefinitionHolder createScopedProxy(BeanDefinitionHolder defini
8383
proxyDefinition.setPrimary(targetDefinition.isPrimary());
8484
if (targetDefinition instanceof AbstractBeanDefinition abd) {
8585
proxyDefinition.copyQualifiersFrom(abd);
86+
proxyDefinition.setDefaultCandidate(abd.isDefaultCandidate());
8687
}
8788

8889
// The target bean should be ignored in favor of the scoped proxy.
8990
targetDefinition.setAutowireCandidate(false);
9091
targetDefinition.setPrimary(false);
92+
if (targetDefinition instanceof AbstractBeanDefinition abd) {
93+
abd.setDefaultCandidate(false);
94+
}
9195

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

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

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,19 @@
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

33+
2434
/**
2535
* Tests for {@link ScopedProxyUtils}.
2636
*
@@ -64,4 +74,67 @@ void getOriginalBeanNameForNonScopedTarget() {
6474
.withMessage("bean name 'myBean' does not refer to the target of a scoped proxy");
6575
}
6676

77+
@Test
78+
void createScopedProxyTargetOvertakesAutowireSettingsToProxyBeanDefinition() {
79+
final AbstractBeanDefinition targetDefinition = new GenericBeanDefinition();
80+
// Opposite of defaults
81+
targetDefinition.setAutowireCandidate(false);
82+
targetDefinition.setDefaultCandidate(false);
83+
targetDefinition.setPrimary(true);
84+
85+
final BeanDefinitionRegistry registry = new SimpleBeanDefinitionRegistry();
86+
final BeanDefinitionHolder proxyHolder = ScopedProxyUtils.createScopedProxy(new BeanDefinitionHolder(targetDefinition, "myBean"), registry, false);
87+
assertThat(proxyHolder).isNotNull();
88+
final BeanDefinition proxyBeanDefinition = proxyHolder.getBeanDefinition();
89+
assertThat(proxyBeanDefinition).isNotNull();
90+
assertThat(proxyBeanDefinition).isInstanceOf(RootBeanDefinition.class);
91+
92+
assertThat(proxyBeanDefinition.isAutowireCandidate()).isFalse();
93+
assertThat(proxyBeanDefinition.isPrimary()).isTrue();
94+
assertThat(((RootBeanDefinition)proxyBeanDefinition).isDefaultCandidate()).isFalse();
95+
}
96+
97+
@Test
98+
void createScopedProxyTargetOvertakesBeanAttributesToProxyBeanDefinition() {
99+
final 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+
final BeanDefinitionRegistry registry = new SimpleBeanDefinitionRegistry();
106+
final BeanDefinitionHolder proxyHolder = ScopedProxyUtils.createScopedProxy(new BeanDefinitionHolder(targetDefinition, "myBean"), registry, false);
107+
assertThat(proxyHolder).isNotNull();
108+
final BeanDefinition proxyBeanDefinition = proxyHolder.getBeanDefinition();
109+
assertThat(proxyBeanDefinition).isNotNull();
110+
111+
assertThat(proxyBeanDefinition.getRole()).isEqualTo(BeanDefinition.ROLE_INFRASTRUCTURE);
112+
assertThat(proxyBeanDefinition).isInstanceOf(RootBeanDefinition.class);
113+
assertThat(proxyBeanDefinition.getPropertyValues()).hasSize(2);
114+
assertThat(proxyBeanDefinition.getPropertyValues().get("proxyTargetClass")).isEqualTo(false);
115+
assertThat(proxyBeanDefinition.getPropertyValues().get("targetBeanName")).isEqualTo(ScopedProxyUtils.getTargetBeanName("myBean"));
116+
117+
final 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+
final AbstractBeanDefinition targetDefinition = new GenericBeanDefinition();
126+
targetDefinition.setAutowireCandidate(true);
127+
targetDefinition.setDefaultCandidate(true);
128+
targetDefinition.setPrimary(true);
129+
130+
final BeanDefinitionRegistry registry = new SimpleBeanDefinitionRegistry();
131+
final BeanDefinitionHolder proxyHolder = ScopedProxyUtils.createScopedProxy(new BeanDefinitionHolder(targetDefinition, "myBean"), registry, false);
132+
assertThat(proxyHolder).isNotNull();
133+
final BeanDefinition proxyBeanDefinition = proxyHolder.getBeanDefinition();
134+
assertThat(proxyBeanDefinition).isNotNull();
135+
136+
assertThat(targetDefinition.isAutowireCandidate()).isFalse();
137+
assertThat(targetDefinition.isDefaultCandidate()).isFalse();
138+
assertThat(targetDefinition.isPrimary()).isFalse();
139+
}
67140
}

0 commit comments

Comments
 (0)