1
1
/*
2
- * Copyright 2002-2024 the original author or authors.
2
+ * Copyright 2002-2025 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
21
21
import java .lang .annotation .RetentionPolicy ;
22
22
import java .lang .annotation .Target ;
23
23
24
- import org .junit .jupiter .api .Disabled ;
25
24
import org .junit .jupiter .api .Test ;
26
25
27
26
import org .springframework .beans .factory .annotation .Qualifier ;
27
+ import org .springframework .beans .factory .annotation .QualifierAnnotationAutowireCandidateResolver ;
28
28
import org .springframework .beans .factory .config .ConstructorArgumentValues ;
29
29
import org .springframework .beans .factory .config .DependencyDescriptor ;
30
+ import org .springframework .beans .testfixture .beans .TestBean ;
30
31
import org .springframework .core .DefaultParameterNameDiscoverer ;
31
32
import org .springframework .core .MethodParameter ;
32
33
import org .springframework .util .ClassUtils ;
@@ -43,14 +44,17 @@ class QualifierAnnotationAutowireBeanFactoryTests {
43
44
44
45
private static final String MARK = "mark" ;
45
46
47
+ private final DefaultListableBeanFactory lbf = new DefaultListableBeanFactory ();
48
+
49
+
46
50
47
51
@ Test
48
52
void testAutowireCandidateDefaultWithIrrelevantDescriptor () throws Exception {
49
- DefaultListableBeanFactory lbf = new DefaultListableBeanFactory ();
50
53
ConstructorArgumentValues cavs = new ConstructorArgumentValues ();
51
54
cavs .addGenericArgumentValue (JUERGEN );
52
55
RootBeanDefinition rbd = new RootBeanDefinition (Person .class , cavs , null );
53
56
lbf .registerBeanDefinition (JUERGEN , rbd );
57
+
54
58
assertThat (lbf .isAutowireCandidate (JUERGEN , null )).isTrue ();
55
59
assertThat (lbf .isAutowireCandidate (JUERGEN ,
56
60
new DependencyDescriptor (Person .class .getDeclaredField ("name" ), false ))).isTrue ();
@@ -60,152 +64,192 @@ void testAutowireCandidateDefaultWithIrrelevantDescriptor() throws Exception {
60
64
61
65
@ Test
62
66
void testAutowireCandidateExplicitlyFalseWithIrrelevantDescriptor () throws Exception {
63
- DefaultListableBeanFactory lbf = new DefaultListableBeanFactory ();
64
67
ConstructorArgumentValues cavs = new ConstructorArgumentValues ();
65
68
cavs .addGenericArgumentValue (JUERGEN );
66
69
RootBeanDefinition rbd = new RootBeanDefinition (Person .class , cavs , null );
67
70
rbd .setAutowireCandidate (false );
68
71
lbf .registerBeanDefinition (JUERGEN , rbd );
72
+
69
73
assertThat (lbf .isAutowireCandidate (JUERGEN , null )).isFalse ();
70
74
assertThat (lbf .isAutowireCandidate (JUERGEN ,
71
75
new DependencyDescriptor (Person .class .getDeclaredField ("name" ), false ))).isFalse ();
72
76
assertThat (lbf .isAutowireCandidate (JUERGEN ,
73
77
new DependencyDescriptor (Person .class .getDeclaredField ("name" ), true ))).isFalse ();
74
78
}
75
79
76
- @ Disabled
77
80
@ Test
78
81
void testAutowireCandidateWithFieldDescriptor () throws Exception {
79
- DefaultListableBeanFactory lbf = new DefaultListableBeanFactory ();
82
+ lbf .setAutowireCandidateResolver (new QualifierAnnotationAutowireCandidateResolver ());
83
+
80
84
ConstructorArgumentValues cavs1 = new ConstructorArgumentValues ();
81
85
cavs1 .addGenericArgumentValue (JUERGEN );
82
86
RootBeanDefinition person1 = new RootBeanDefinition (Person .class , cavs1 , null );
83
87
person1 .addQualifier (new AutowireCandidateQualifier (TestQualifier .class ));
84
88
lbf .registerBeanDefinition (JUERGEN , person1 );
89
+
85
90
ConstructorArgumentValues cavs2 = new ConstructorArgumentValues ();
86
91
cavs2 .addGenericArgumentValue (MARK );
87
92
RootBeanDefinition person2 = new RootBeanDefinition (Person .class , cavs2 , null );
88
93
lbf .registerBeanDefinition (MARK , person2 );
94
+
89
95
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor (
90
96
QualifiedTestBean .class .getDeclaredField ("qualified" ), false );
91
97
DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor (
92
98
QualifiedTestBean .class .getDeclaredField ("nonqualified" ), false );
93
- assertThat ( lbf . isAutowireCandidate ( JUERGEN , null )). isTrue ();
99
+
94
100
assertThat (lbf .isAutowireCandidate (JUERGEN , nonqualifiedDescriptor )).isTrue ();
95
101
assertThat (lbf .isAutowireCandidate (JUERGEN , qualifiedDescriptor )).isTrue ();
96
- assertThat (lbf .isAutowireCandidate (MARK , null )).isTrue ();
97
102
assertThat (lbf .isAutowireCandidate (MARK , nonqualifiedDescriptor )).isTrue ();
98
103
assertThat (lbf .isAutowireCandidate (MARK , qualifiedDescriptor )).isFalse ();
99
104
}
100
105
101
106
@ Test
102
107
void testAutowireCandidateExplicitlyFalseWithFieldDescriptor () throws Exception {
103
- DefaultListableBeanFactory lbf = new DefaultListableBeanFactory ();
104
108
ConstructorArgumentValues cavs = new ConstructorArgumentValues ();
105
109
cavs .addGenericArgumentValue (JUERGEN );
106
110
RootBeanDefinition person = new RootBeanDefinition (Person .class , cavs , null );
107
111
person .setAutowireCandidate (false );
108
112
person .addQualifier (new AutowireCandidateQualifier (TestQualifier .class ));
109
113
lbf .registerBeanDefinition (JUERGEN , person );
114
+
110
115
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor (
111
116
QualifiedTestBean .class .getDeclaredField ("qualified" ), false );
112
117
DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor (
113
118
QualifiedTestBean .class .getDeclaredField ("nonqualified" ), false );
119
+
114
120
assertThat (lbf .isAutowireCandidate (JUERGEN , null )).isFalse ();
115
121
assertThat (lbf .isAutowireCandidate (JUERGEN , nonqualifiedDescriptor )).isFalse ();
116
122
assertThat (lbf .isAutowireCandidate (JUERGEN , qualifiedDescriptor )).isFalse ();
117
123
}
118
124
119
125
@ Test
120
126
void testAutowireCandidateWithShortClassName () throws Exception {
121
- DefaultListableBeanFactory lbf = new DefaultListableBeanFactory ();
122
127
ConstructorArgumentValues cavs = new ConstructorArgumentValues ();
123
128
cavs .addGenericArgumentValue (JUERGEN );
124
129
RootBeanDefinition person = new RootBeanDefinition (Person .class , cavs , null );
125
130
person .addQualifier (new AutowireCandidateQualifier (ClassUtils .getShortName (TestQualifier .class )));
126
131
lbf .registerBeanDefinition (JUERGEN , person );
132
+
127
133
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor (
128
134
QualifiedTestBean .class .getDeclaredField ("qualified" ), false );
129
135
DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor (
130
136
QualifiedTestBean .class .getDeclaredField ("nonqualified" ), false );
137
+
131
138
assertThat (lbf .isAutowireCandidate (JUERGEN , null )).isTrue ();
132
139
assertThat (lbf .isAutowireCandidate (JUERGEN , nonqualifiedDescriptor )).isTrue ();
133
140
assertThat (lbf .isAutowireCandidate (JUERGEN , qualifiedDescriptor )).isTrue ();
134
141
}
135
142
136
- @ Disabled
137
143
@ Test
138
144
void testAutowireCandidateWithConstructorDescriptor () throws Exception {
139
- DefaultListableBeanFactory lbf = new DefaultListableBeanFactory ();
145
+ lbf .setAutowireCandidateResolver (new QualifierAnnotationAutowireCandidateResolver ());
146
+
140
147
ConstructorArgumentValues cavs1 = new ConstructorArgumentValues ();
141
148
cavs1 .addGenericArgumentValue (JUERGEN );
142
149
RootBeanDefinition person1 = new RootBeanDefinition (Person .class , cavs1 , null );
143
150
person1 .addQualifier (new AutowireCandidateQualifier (TestQualifier .class ));
144
151
lbf .registerBeanDefinition (JUERGEN , person1 );
152
+
145
153
ConstructorArgumentValues cavs2 = new ConstructorArgumentValues ();
146
154
cavs2 .addGenericArgumentValue (MARK );
147
155
RootBeanDefinition person2 = new RootBeanDefinition (Person .class , cavs2 , null );
148
156
lbf .registerBeanDefinition (MARK , person2 );
157
+
149
158
MethodParameter param = new MethodParameter (QualifiedTestBean .class .getDeclaredConstructor (Person .class ), 0 );
150
159
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor (param , false );
151
160
param .initParameterNameDiscovery (new DefaultParameterNameDiscoverer ());
161
+
152
162
assertThat (param .getParameterName ()).isEqualTo ("tpb" );
153
- assertThat (lbf .isAutowireCandidate (JUERGEN , null )).isTrue ();
154
163
assertThat (lbf .isAutowireCandidate (JUERGEN , qualifiedDescriptor )).isTrue ();
155
164
assertThat (lbf .isAutowireCandidate (MARK , qualifiedDescriptor )).isFalse ();
156
165
}
157
166
158
- @ Disabled
159
167
@ Test
160
168
void testAutowireCandidateWithMethodDescriptor () throws Exception {
161
- DefaultListableBeanFactory lbf = new DefaultListableBeanFactory ();
169
+ lbf .setAutowireCandidateResolver (new QualifierAnnotationAutowireCandidateResolver ());
170
+
162
171
ConstructorArgumentValues cavs1 = new ConstructorArgumentValues ();
163
172
cavs1 .addGenericArgumentValue (JUERGEN );
164
173
RootBeanDefinition person1 = new RootBeanDefinition (Person .class , cavs1 , null );
165
174
person1 .addQualifier (new AutowireCandidateQualifier (TestQualifier .class ));
166
175
lbf .registerBeanDefinition (JUERGEN , person1 );
176
+
167
177
ConstructorArgumentValues cavs2 = new ConstructorArgumentValues ();
168
178
cavs2 .addGenericArgumentValue (MARK );
169
179
RootBeanDefinition person2 = new RootBeanDefinition (Person .class , cavs2 , null );
170
180
lbf .registerBeanDefinition (MARK , person2 );
181
+
171
182
MethodParameter qualifiedParam =
172
183
new MethodParameter (QualifiedTestBean .class .getDeclaredMethod ("autowireQualified" , Person .class ), 0 );
173
184
MethodParameter nonqualifiedParam =
174
185
new MethodParameter (QualifiedTestBean .class .getDeclaredMethod ("autowireNonqualified" , Person .class ), 0 );
175
186
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor (qualifiedParam , false );
176
187
DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor (nonqualifiedParam , false );
177
188
qualifiedParam .initParameterNameDiscovery (new DefaultParameterNameDiscoverer ());
178
- assertThat (qualifiedParam .getParameterName ()).isEqualTo ("tpb" );
179
189
nonqualifiedParam .initParameterNameDiscovery (new DefaultParameterNameDiscoverer ());
190
+
191
+ assertThat (qualifiedParam .getParameterName ()).isEqualTo ("tpb" );
180
192
assertThat (nonqualifiedParam .getParameterName ()).isEqualTo ("tpb" );
181
- assertThat (lbf .isAutowireCandidate (JUERGEN , null )).isTrue ();
182
193
assertThat (lbf .isAutowireCandidate (JUERGEN , nonqualifiedDescriptor )).isTrue ();
183
194
assertThat (lbf .isAutowireCandidate (JUERGEN , qualifiedDescriptor )).isTrue ();
184
- assertThat (lbf .isAutowireCandidate (MARK , null )).isTrue ();
185
195
assertThat (lbf .isAutowireCandidate (MARK , nonqualifiedDescriptor )).isTrue ();
186
196
assertThat (lbf .isAutowireCandidate (MARK , qualifiedDescriptor )).isFalse ();
187
197
}
188
198
189
199
@ Test
190
200
void testAutowireCandidateWithMultipleCandidatesDescriptor () throws Exception {
191
- DefaultListableBeanFactory lbf = new DefaultListableBeanFactory ();
192
201
ConstructorArgumentValues cavs1 = new ConstructorArgumentValues ();
193
202
cavs1 .addGenericArgumentValue (JUERGEN );
194
203
RootBeanDefinition person1 = new RootBeanDefinition (Person .class , cavs1 , null );
195
204
person1 .addQualifier (new AutowireCandidateQualifier (TestQualifier .class ));
196
205
lbf .registerBeanDefinition (JUERGEN , person1 );
206
+
197
207
ConstructorArgumentValues cavs2 = new ConstructorArgumentValues ();
198
208
cavs2 .addGenericArgumentValue (MARK );
199
209
RootBeanDefinition person2 = new RootBeanDefinition (Person .class , cavs2 , null );
200
210
person2 .addQualifier (new AutowireCandidateQualifier (TestQualifier .class ));
201
211
lbf .registerBeanDefinition (MARK , person2 );
212
+
202
213
DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor (
203
214
new MethodParameter (QualifiedTestBean .class .getDeclaredConstructor (Person .class ), 0 ),
204
215
false );
216
+
205
217
assertThat (lbf .isAutowireCandidate (JUERGEN , qualifiedDescriptor )).isTrue ();
206
218
assertThat (lbf .isAutowireCandidate (MARK , qualifiedDescriptor )).isTrue ();
207
219
}
208
220
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
+
209
253
210
254
@ SuppressWarnings ("unused" )
211
255
private static class QualifiedTestBean {
@@ -247,4 +291,8 @@ public String getName() {
247
291
private @interface TestQualifier {
248
292
}
249
293
294
+
295
+ @ Qualifier ("spouse" )
296
+ private TestBean testBean ;
297
+
250
298
}
0 commit comments