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