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.
2121import java .lang .annotation .RetentionPolicy ;
2222import java .lang .annotation .Target ;
2323
24- import org .junit .jupiter .api .Disabled ;
2524import org .junit .jupiter .api .Test ;
2625
2726import org .springframework .beans .factory .annotation .Qualifier ;
27+ import org .springframework .beans .factory .annotation .QualifierAnnotationAutowireCandidateResolver ;
2828import org .springframework .beans .factory .config .ConstructorArgumentValues ;
2929import org .springframework .beans .factory .config .DependencyDescriptor ;
30+ import org .springframework .beans .testfixture .beans .TestBean ;
3031import org .springframework .core .DefaultParameterNameDiscoverer ;
3132import org .springframework .core .MethodParameter ;
3233import 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