1 /*
2  * Copyright 2002-2008 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package org.springframework.beans.factory.support;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertFalse;
21 import static org.junit.Assert.assertTrue;
22 
23 import java.lang.annotation.ElementType;
24 import java.lang.annotation.Retention;
25 import java.lang.annotation.RetentionPolicy;
26 import java.lang.annotation.Target;
27 
28 import org.junit.Ignore;
29 import org.junit.Test;
30 import org.springframework.beans.factory.annotation.Qualifier;
31 import org.springframework.beans.factory.config.ConstructorArgumentValues;
32 import org.springframework.beans.factory.config.DependencyDescriptor;
33 import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
34 import org.springframework.core.MethodParameter;
35 import org.springframework.util.ClassUtils;
36 
37 /**
38  * @author Mark Fisher
39  * @author Juergen Hoeller
40  */
41 public class QualifierAnnotationAutowireBeanFactoryTests {
42 
43 	private static final String JUERGEN = "juergen";
44 
45 	private static final String MARK = "mark";
46 
47 
48 	@Test
testAutowireCandidateDefaultWithIrrelevantDescriptor()49 	public void testAutowireCandidateDefaultWithIrrelevantDescriptor() throws Exception {
50 		DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
51 		ConstructorArgumentValues cavs = new ConstructorArgumentValues();
52 		cavs.addGenericArgumentValue(JUERGEN);
53 		RootBeanDefinition rbd = new RootBeanDefinition(Person.class, cavs, null);
54 		lbf.registerBeanDefinition(JUERGEN, rbd);
55 		assertTrue(lbf.isAutowireCandidate(JUERGEN, null));
56 		assertTrue(lbf.isAutowireCandidate(JUERGEN,
57 				new DependencyDescriptor(Person.class.getDeclaredField("name"), false)));
58 		assertTrue(lbf.isAutowireCandidate(JUERGEN,
59 				new DependencyDescriptor(Person.class.getDeclaredField("name"), true)));
60 	}
61 
62 	@Test
testAutowireCandidateExplicitlyFalseWithIrrelevantDescriptor()63 	public void testAutowireCandidateExplicitlyFalseWithIrrelevantDescriptor() throws Exception {
64 		DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
65 		ConstructorArgumentValues cavs = new ConstructorArgumentValues();
66 		cavs.addGenericArgumentValue(JUERGEN);
67 		RootBeanDefinition rbd = new RootBeanDefinition(Person.class, cavs, null);
68 		rbd.setAutowireCandidate(false);
69 		lbf.registerBeanDefinition(JUERGEN, rbd);
70 		assertFalse(lbf.isAutowireCandidate(JUERGEN, null));
71 		assertFalse(lbf.isAutowireCandidate(JUERGEN,
72 				new DependencyDescriptor(Person.class.getDeclaredField("name"), false)));
73 		assertFalse(lbf.isAutowireCandidate(JUERGEN,
74 				new DependencyDescriptor(Person.class.getDeclaredField("name"), true)));
75 	}
76 
77 	@Ignore
78 	@Test
testAutowireCandidateWithFieldDescriptor()79 	public void testAutowireCandidateWithFieldDescriptor() throws Exception {
80 		DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
81 		ConstructorArgumentValues cavs1 = new ConstructorArgumentValues();
82 		cavs1.addGenericArgumentValue(JUERGEN);
83 		RootBeanDefinition person1 = new RootBeanDefinition(Person.class, cavs1, null);
84 		person1.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
85 		lbf.registerBeanDefinition(JUERGEN, person1);
86 		ConstructorArgumentValues cavs2 = new ConstructorArgumentValues();
87 		cavs2.addGenericArgumentValue(MARK);
88 		RootBeanDefinition person2 = new RootBeanDefinition(Person.class, cavs2, null);
89 		lbf.registerBeanDefinition(MARK, person2);
90 		DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(
91 				QualifiedTestBean.class.getDeclaredField("qualified"), false);
92 		DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor(
93 				QualifiedTestBean.class.getDeclaredField("nonqualified"), false);
94 		assertTrue(lbf.isAutowireCandidate(JUERGEN, null));
95 		assertTrue(lbf.isAutowireCandidate(JUERGEN, nonqualifiedDescriptor));
96 		assertTrue(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor));
97 		assertTrue(lbf.isAutowireCandidate(MARK, null));
98 		assertTrue(lbf.isAutowireCandidate(MARK, nonqualifiedDescriptor));
99 		assertFalse(lbf.isAutowireCandidate(MARK, qualifiedDescriptor));
100 	}
101 
102 	@Test
testAutowireCandidateExplicitlyFalseWithFieldDescriptor()103 	public void testAutowireCandidateExplicitlyFalseWithFieldDescriptor() throws Exception {
104 		DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
105 		ConstructorArgumentValues cavs = new ConstructorArgumentValues();
106 		cavs.addGenericArgumentValue(JUERGEN);
107 		RootBeanDefinition person = new RootBeanDefinition(Person.class, cavs, null);
108 		person.setAutowireCandidate(false);
109 		person.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
110 		lbf.registerBeanDefinition(JUERGEN, person);
111 		DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(
112 				QualifiedTestBean.class.getDeclaredField("qualified"), false);
113 		DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor(
114 				QualifiedTestBean.class.getDeclaredField("nonqualified"), false);
115 		assertFalse(lbf.isAutowireCandidate(JUERGEN, null));
116 		assertFalse(lbf.isAutowireCandidate(JUERGEN, nonqualifiedDescriptor));
117 		assertFalse(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor));
118 	}
119 
120 	@Test
testAutowireCandidateWithShortClassName()121 	public void testAutowireCandidateWithShortClassName() throws Exception {
122 		DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
123 		ConstructorArgumentValues cavs = new ConstructorArgumentValues();
124 		cavs.addGenericArgumentValue(JUERGEN);
125 		RootBeanDefinition person = new RootBeanDefinition(Person.class, cavs, null);
126 		person.addQualifier(new AutowireCandidateQualifier(ClassUtils.getShortName(TestQualifier.class)));
127 		lbf.registerBeanDefinition(JUERGEN, person);
128 		DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(
129 				QualifiedTestBean.class.getDeclaredField("qualified"), false);
130 		DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor(
131 				QualifiedTestBean.class.getDeclaredField("nonqualified"), false);
132 		assertTrue(lbf.isAutowireCandidate(JUERGEN, null));
133 		assertTrue(lbf.isAutowireCandidate(JUERGEN, nonqualifiedDescriptor));
134 		assertTrue(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor));
135 	}
136 
137 	@Ignore
138 	@Test
testAutowireCandidateWithConstructorDescriptor()139 	public void testAutowireCandidateWithConstructorDescriptor() throws Exception {
140 		DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
141 		ConstructorArgumentValues cavs1 = new ConstructorArgumentValues();
142 		cavs1.addGenericArgumentValue(JUERGEN);
143 		RootBeanDefinition person1 = new RootBeanDefinition(Person.class, cavs1, null);
144 		person1.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
145 		lbf.registerBeanDefinition(JUERGEN, person1);
146 		ConstructorArgumentValues cavs2 = new ConstructorArgumentValues();
147 		cavs2.addGenericArgumentValue(MARK);
148 		RootBeanDefinition person2 = new RootBeanDefinition(Person.class, cavs2, null);
149 		lbf.registerBeanDefinition(MARK, person2);
150 		MethodParameter param = new MethodParameter(QualifiedTestBean.class.getDeclaredConstructor(Person.class), 0);
151 		DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(param, false);
152 		param.initParameterNameDiscovery(new LocalVariableTableParameterNameDiscoverer());
153 		assertEquals("tpb", param.getParameterName());
154 		assertTrue(lbf.isAutowireCandidate(JUERGEN, null));
155 		assertTrue(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor));
156 		assertFalse(lbf.isAutowireCandidate(MARK, qualifiedDescriptor));
157 	}
158 
159 	@Ignore
160 	@Test
testAutowireCandidateWithMethodDescriptor()161 	public void testAutowireCandidateWithMethodDescriptor() throws Exception {
162 		DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
163 		ConstructorArgumentValues cavs1 = new ConstructorArgumentValues();
164 		cavs1.addGenericArgumentValue(JUERGEN);
165 		RootBeanDefinition person1 = new RootBeanDefinition(Person.class, cavs1, null);
166 		person1.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
167 		lbf.registerBeanDefinition(JUERGEN, person1);
168 		ConstructorArgumentValues cavs2 = new ConstructorArgumentValues();
169 		cavs2.addGenericArgumentValue(MARK);
170 		RootBeanDefinition person2 = new RootBeanDefinition(Person.class, cavs2, null);
171 		lbf.registerBeanDefinition(MARK, person2);
172 		MethodParameter qualifiedParam =
173 				new MethodParameter(QualifiedTestBean.class.getDeclaredMethod("autowireQualified", Person.class), 0);
174 		MethodParameter nonqualifiedParam =
175 				new MethodParameter(QualifiedTestBean.class.getDeclaredMethod("autowireNonqualified", Person.class), 0);
176 		DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(qualifiedParam, false);
177 		DependencyDescriptor nonqualifiedDescriptor = new DependencyDescriptor(nonqualifiedParam, false);
178 		qualifiedParam.initParameterNameDiscovery(new LocalVariableTableParameterNameDiscoverer());
179 		assertEquals("tpb", qualifiedParam.getParameterName());
180 		nonqualifiedParam.initParameterNameDiscovery(new LocalVariableTableParameterNameDiscoverer());
181 		assertEquals("tpb", nonqualifiedParam.getParameterName());
182 		assertTrue(lbf.isAutowireCandidate(JUERGEN, null));
183 		assertTrue(lbf.isAutowireCandidate(JUERGEN, nonqualifiedDescriptor));
184 		assertTrue(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor));
185 		assertTrue(lbf.isAutowireCandidate(MARK, null));
186 		assertTrue(lbf.isAutowireCandidate(MARK, nonqualifiedDescriptor));
187 		assertFalse(lbf.isAutowireCandidate(MARK, qualifiedDescriptor));
188 	}
189 
190 	@Test
testAutowireCandidateWithMultipleCandidatesDescriptor()191 	public void testAutowireCandidateWithMultipleCandidatesDescriptor() throws Exception {
192 		DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
193 		ConstructorArgumentValues cavs1 = new ConstructorArgumentValues();
194 		cavs1.addGenericArgumentValue(JUERGEN);
195 		RootBeanDefinition person1 = new RootBeanDefinition(Person.class, cavs1, null);
196 		person1.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
197 		lbf.registerBeanDefinition(JUERGEN, person1);
198 		ConstructorArgumentValues cavs2 = new ConstructorArgumentValues();
199 		cavs2.addGenericArgumentValue(MARK);
200 		RootBeanDefinition person2 = new RootBeanDefinition(Person.class, cavs2, null);
201 		person2.addQualifier(new AutowireCandidateQualifier(TestQualifier.class));
202 		lbf.registerBeanDefinition(MARK, person2);
203 		DependencyDescriptor qualifiedDescriptor = new DependencyDescriptor(
204 				new MethodParameter(QualifiedTestBean.class.getDeclaredConstructor(Person.class), 0),
205 				false);
206 		assertTrue(lbf.isAutowireCandidate(JUERGEN, qualifiedDescriptor));
207 		assertTrue(lbf.isAutowireCandidate(MARK, qualifiedDescriptor));
208 	}
209 
210 
211 	private static class QualifiedTestBean {
212 
213 		@TestQualifier
214 		private Person qualified;
215 
216 		private Person nonqualified;
217 
QualifiedTestBean(@estQualifier Person tpb)218 		public QualifiedTestBean(@TestQualifier Person tpb) {
219 		}
220 
autowireQualified(@estQualifier Person tpb)221 		public void autowireQualified(@TestQualifier Person tpb) {
222 		}
223 
autowireNonqualified(Person tpb)224 		public void autowireNonqualified(Person tpb) {
225 		}
226 	}
227 
228 
229 	private static class Person {
230 
231 		private String name;
232 
Person(String name)233 		public Person(String name) {
234 			this.name = name;
235 		}
236 
getName()237 		public String getName() {
238 			return this.name;
239 		}
240 	}
241 
242 
243 	@Target({ElementType.FIELD, ElementType.PARAMETER})
244 	@Retention(RetentionPolicy.RUNTIME)
245 	@Qualifier
246 	private static @interface TestQualifier {
247 	}
248 
249 }
250