Skip to content

Commit 564d3f6

Browse files
committed
Enable qualifier annotation tests including backported precedence tests
See gh-34644
1 parent 7a1dfe7 commit 564d3f6

File tree

1 file changed

+67
-19
lines changed

1 file changed

+67
-19
lines changed

spring-beans/src/test/java/org/springframework/beans/factory/support/QualifierAnnotationAutowireBeanFactoryTests.java

+67-19
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,12 +21,13 @@
2121
import java.lang.annotation.RetentionPolicy;
2222
import java.lang.annotation.Target;
2323

24-
import org.junit.jupiter.api.Disabled;
2524
import org.junit.jupiter.api.Test;
2625

2726
import org.springframework.beans.factory.annotation.Qualifier;
27+
import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver;
2828
import org.springframework.beans.factory.config.ConstructorArgumentValues;
2929
import org.springframework.beans.factory.config.DependencyDescriptor;
30+
import org.springframework.beans.testfixture.beans.TestBean;
3031
import org.springframework.core.DefaultParameterNameDiscoverer;
3132
import org.springframework.core.MethodParameter;
3233
import org.springframework.util.ClassUtils;
@@ -43,14 +44,17 @@ class QualifierAnnotationAutowireBeanFactoryTests {
4344

4445
private static final String MARK = "mark";
4546

47+
private final DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
48+
49+
4650

4751
@Test
4852
void testAutowireCandidateDefaultWithIrrelevantDescriptor() throws Exception {
49-
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
5053
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
5154
cavs.addGenericArgumentValue(JUERGEN);
5255
RootBeanDefinition rbd = new RootBeanDefinition(Person.class, cavs, null);
5356
lbf.registerBeanDefinition(JUERGEN, rbd);
57+
5458
assertThat(lbf.isAutowireCandidate(JUERGEN, null)).isTrue();
5559
assertThat(lbf.isAutowireCandidate(JUERGEN,
5660
new DependencyDescriptor(Person.class.getDeclaredField("name"), false))).isTrue();
@@ -60,152 +64,192 @@ void testAutowireCandidateDefaultWithIrrelevantDescriptor() throws Exception {
6064

6165
@Test
6266
void testAutowireCandidateExplicitlyFalseWithIrrelevantDescriptor() throws Exception {
63-
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
6467
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
6568
cavs.addGenericArgumentValue(JUERGEN);
6669
RootBeanDefinition rbd = new RootBeanDefinition(Person.class, cavs, null);
6770
rbd.setAutowireCandidate(false);
6871
lbf.registerBeanDefinition(JUERGEN, rbd);
72+
6973
assertThat(lbf.isAutowireCandidate(JUERGEN, null)).isFalse();
7074
assertThat(lbf.isAutowireCandidate(JUERGEN,
7175
new DependencyDescriptor(Person.class.getDeclaredField("name"), false))).isFalse();
7276
assertThat(lbf.isAutowireCandidate(JUERGEN,
7377
new DependencyDescriptor(Person.class.getDeclaredField("name"), true))).isFalse();
7478
}
7579

76-
@Disabled
7780
@Test
7881
void testAutowireCandidateWithFieldDescriptor() throws Exception {
79-
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
82+
lbf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
83+
8084
ConstructorArgumentValues cavs1 = new ConstructorArgumentValues();
8185
cavs1.addGenericArgumentValue(JUERGEN);
8286
RootBeanDefinition person1 = new RootBeanDefinition(Person.class, cavs1, null);
8387
person1.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
8488
lbf.registerBeanDefinition(JUERGEN, person1);
89+
8590
ConstructorArgumentValues cavs2 = new ConstructorArgumentValues();
8691
cavs2.addGenericArgumentValue(MARK);
8792
RootBeanDefinition person2 = new RootBeanDefinition(Person.class, cavs2, null);
8893
lbf.registerBeanDefinition(MARK, person2);
94+
8995
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(
9096
QualifiedTestBean.class.getDeclaredField("qualified"), false);
9197
DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor(
9298
QualifiedTestBean.class.getDeclaredField("nonqualified"), false);
93-
assertThat(lbf.isAutowireCandidate(JUERGEN, null)).isTrue();
99+
94100
assertThat(lbf.isAutowireCandidate(JUERGEN, nonqualifiedDescriptor)).isTrue();
95101
assertThat(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor)).isTrue();
96-
assertThat(lbf.isAutowireCandidate(MARK, null)).isTrue();
97102
assertThat(lbf.isAutowireCandidate(MARK, nonqualifiedDescriptor)).isTrue();
98103
assertThat(lbf.isAutowireCandidate(MARK, qualifiedDescriptor)).isFalse();
99104
}
100105

101106
@Test
102107
void testAutowireCandidateExplicitlyFalseWithFieldDescriptor() throws Exception {
103-
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
104108
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
105109
cavs.addGenericArgumentValue(JUERGEN);
106110
RootBeanDefinition person = new RootBeanDefinition(Person.class, cavs, null);
107111
person.setAutowireCandidate(false);
108112
person.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
109113
lbf.registerBeanDefinition(JUERGEN, person);
114+
110115
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(
111116
QualifiedTestBean.class.getDeclaredField("qualified"), false);
112117
DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor(
113118
QualifiedTestBean.class.getDeclaredField("nonqualified"), false);
119+
114120
assertThat(lbf.isAutowireCandidate(JUERGEN, null)).isFalse();
115121
assertThat(lbf.isAutowireCandidate(JUERGEN, nonqualifiedDescriptor)).isFalse();
116122
assertThat(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor)).isFalse();
117123
}
118124

119125
@Test
120126
void testAutowireCandidateWithShortClassName() throws Exception {
121-
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
122127
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
123128
cavs.addGenericArgumentValue(JUERGEN);
124129
RootBeanDefinition person = new RootBeanDefinition(Person.class, cavs, null);
125130
person.addQualifier(new AutowireCandidateQualifier(ClassUtils.getShortName(TestQualifier.class)));
126131
lbf.registerBeanDefinition(JUERGEN, person);
132+
127133
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(
128134
QualifiedTestBean.class.getDeclaredField("qualified"), false);
129135
DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor(
130136
QualifiedTestBean.class.getDeclaredField("nonqualified"), false);
137+
131138
assertThat(lbf.isAutowireCandidate(JUERGEN, null)).isTrue();
132139
assertThat(lbf.isAutowireCandidate(JUERGEN, nonqualifiedDescriptor)).isTrue();
133140
assertThat(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor)).isTrue();
134141
}
135142

136-
@Disabled
137143
@Test
138144
void testAutowireCandidateWithConstructorDescriptor() throws Exception {
139-
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
145+
lbf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
146+
140147
ConstructorArgumentValues cavs1 = new ConstructorArgumentValues();
141148
cavs1.addGenericArgumentValue(JUERGEN);
142149
RootBeanDefinition person1 = new RootBeanDefinition(Person.class, cavs1, null);
143150
person1.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
144151
lbf.registerBeanDefinition(JUERGEN, person1);
152+
145153
ConstructorArgumentValues cavs2 = new ConstructorArgumentValues();
146154
cavs2.addGenericArgumentValue(MARK);
147155
RootBeanDefinition person2 = new RootBeanDefinition(Person.class, cavs2, null);
148156
lbf.registerBeanDefinition(MARK, person2);
157+
149158
MethodParameter param = new MethodParameter(QualifiedTestBean.class.getDeclaredConstructor(Person.class), 0);
150159
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(param, false);
151160
param.initParameterNameDiscovery(new DefaultParameterNameDiscoverer());
161+
152162
assertThat(param.getParameterName()).isEqualTo("tpb");
153-
assertThat(lbf.isAutowireCandidate(JUERGEN, null)).isTrue();
154163
assertThat(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor)).isTrue();
155164
assertThat(lbf.isAutowireCandidate(MARK, qualifiedDescriptor)).isFalse();
156165
}
157166

158-
@Disabled
159167
@Test
160168
void testAutowireCandidateWithMethodDescriptor() throws Exception {
161-
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
169+
lbf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
170+
162171
ConstructorArgumentValues cavs1 = new ConstructorArgumentValues();
163172
cavs1.addGenericArgumentValue(JUERGEN);
164173
RootBeanDefinition person1 = new RootBeanDefinition(Person.class, cavs1, null);
165174
person1.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
166175
lbf.registerBeanDefinition(JUERGEN, person1);
176+
167177
ConstructorArgumentValues cavs2 = new ConstructorArgumentValues();
168178
cavs2.addGenericArgumentValue(MARK);
169179
RootBeanDefinition person2 = new RootBeanDefinition(Person.class, cavs2, null);
170180
lbf.registerBeanDefinition(MARK, person2);
181+
171182
MethodParameter qualifiedParam =
172183
new MethodParameter(QualifiedTestBean.class.getDeclaredMethod("autowireQualified", Person.class), 0);
173184
MethodParameter nonqualifiedParam =
174185
new MethodParameter(QualifiedTestBean.class.getDeclaredMethod("autowireNonqualified", Person.class), 0);
175186
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(qualifiedParam, false);
176187
DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor(nonqualifiedParam, false);
177188
qualifiedParam.initParameterNameDiscovery(new DefaultParameterNameDiscoverer());
178-
assertThat(qualifiedParam.getParameterName()).isEqualTo("tpb");
179189
nonqualifiedParam.initParameterNameDiscovery(new DefaultParameterNameDiscoverer());
190+
191+
assertThat(qualifiedParam.getParameterName()).isEqualTo("tpb");
180192
assertThat(nonqualifiedParam.getParameterName()).isEqualTo("tpb");
181-
assertThat(lbf.isAutowireCandidate(JUERGEN, null)).isTrue();
182193
assertThat(lbf.isAutowireCandidate(JUERGEN, nonqualifiedDescriptor)).isTrue();
183194
assertThat(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor)).isTrue();
184-
assertThat(lbf.isAutowireCandidate(MARK, null)).isTrue();
185195
assertThat(lbf.isAutowireCandidate(MARK, nonqualifiedDescriptor)).isTrue();
186196
assertThat(lbf.isAutowireCandidate(MARK, qualifiedDescriptor)).isFalse();
187197
}
188198

189199
@Test
190200
void testAutowireCandidateWithMultipleCandidatesDescriptor() throws Exception {
191-
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
192201
ConstructorArgumentValues cavs1 = new ConstructorArgumentValues();
193202
cavs1.addGenericArgumentValue(JUERGEN);
194203
RootBeanDefinition person1 = new RootBeanDefinition(Person.class, cavs1, null);
195204
person1.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
196205
lbf.registerBeanDefinition(JUERGEN, person1);
206+
197207
ConstructorArgumentValues cavs2 = new ConstructorArgumentValues();
198208
cavs2.addGenericArgumentValue(MARK);
199209
RootBeanDefinition person2 = new RootBeanDefinition(Person.class, cavs2, null);
200210
person2.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
201211
lbf.registerBeanDefinition(MARK, person2);
212+
202213
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(
203214
new MethodParameter(QualifiedTestBean.class.getDeclaredConstructor(Person.class), 0),
204215
false);
216+
205217
assertThat(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor)).isTrue();
206218
assertThat(lbf.isAutowireCandidate(MARK, qualifiedDescriptor)).isTrue();
207219
}
208220

221+
@Test
222+
void autowireBeanByTypeWithQualifierPrecedence() throws Exception {
223+
lbf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
224+
225+
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
226+
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
227+
lbf.registerBeanDefinition("testBean", bd);
228+
lbf.registerBeanDefinition("spouse", bd2);
229+
lbf.registerAlias("test", "testBean");
230+
231+
assertThat(lbf.resolveDependency(new DependencyDescriptor(getClass().getDeclaredField("testBean"), true), null))
232+
.isSameAs(lbf.getBean("spouse"));
233+
}
234+
235+
@Test
236+
void autowireBeanByTypeWithQualifierPrecedenceInAncestor() throws Exception {
237+
DefaultListableBeanFactory parent = new DefaultListableBeanFactory();
238+
parent.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
239+
240+
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
241+
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
242+
parent.registerBeanDefinition("test", bd);
243+
parent.registerBeanDefinition("spouse", bd2);
244+
parent.registerAlias("test", "testBean");
245+
246+
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(parent);
247+
lbf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
248+
249+
assertThat(lbf.resolveDependency(new DependencyDescriptor(getClass().getDeclaredField("testBean"), true), null))
250+
.isSameAs(lbf.getBean("spouse"));
251+
}
252+
209253

210254
@SuppressWarnings("unused")
211255
private static class QualifiedTestBean {
@@ -247,4 +291,8 @@ public String getName() {
247291
private @interface TestQualifier {
248292
}
249293

294+
295+
@Qualifier("spouse")
296+
private TestBean testBean;
297+
250298
}

0 commit comments

Comments
 (0)