diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java
index 4654f4a46e1..303bd3da68b 100644
--- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java
+++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java
@@ -214,15 +214,14 @@ public class QualifierAnnotationAutowireCandidateResolver implements AutowireCan
}
if (targetAnnotation == null) {
// look for matching annotation on the target class
- Class> beanType = null;
if (this.beanFactory != null) {
- beanType = this.beanFactory.getType(bdHolder.getBeanName());
+ Class> beanType = this.beanFactory.getType(bdHolder.getBeanName());
+ if (beanType != null) {
+ targetAnnotation = ClassUtils.getUserClass(beanType).getAnnotation(type);
+ }
}
- else if (bd.hasBeanClass()) {
- beanType = bd.getBeanClass();
- }
- if (beanType != null) {
- targetAnnotation = ClassUtils.getUserClass(beanType).getAnnotation(type);
+ if (targetAnnotation == null && bd.hasBeanClass()) {
+ targetAnnotation = ClassUtils.getUserClass(bd.getBeanClass()).getAnnotation(type);
}
}
if (targetAnnotation != null && targetAnnotation.equals(annotation)) {
diff --git a/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/QualifierAnnotationTests-context.xml b/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/QualifierAnnotationTests-context.xml
index 0dea4d5c342..bdc524aa8ba 100644
--- a/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/QualifierAnnotationTests-context.xml
+++ b/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/QualifierAnnotationTests-context.xml
@@ -45,4 +45,10 @@
+
+
+
+
+
+
diff --git a/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/QualifierAnnotationTests.java b/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/QualifierAnnotationTests.java
index 797f5a12738..587b492fd2a 100644
--- a/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/QualifierAnnotationTests.java
+++ b/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/QualifierAnnotationTests.java
@@ -27,6 +27,7 @@ import static org.junit.Assert.*;
import org.junit.Test;
import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver;
@@ -181,13 +182,20 @@ public final class QualifierAnnotationTests {
QualifierAnnotationAutowireCandidateResolver resolver = (QualifierAnnotationAutowireCandidateResolver)
context.getDefaultListableBeanFactory().getAutowireCandidateResolver();
resolver.addQualifierType(MultipleAttributeQualifier.class);
- context.registerSingleton("testBean", QualifiedByAttributesTestBean.class);
+ context.registerSingleton("testBean", MultiQualifierClient.class);
context.refresh();
- QualifiedByAttributesTestBean testBean = (QualifiedByAttributesTestBean) context.getBean("testBean");
- Person moeSenior = testBean.getMoeSenior();
- Person moeJunior = testBean.getMoeJunior();
- assertEquals("Moe Sr.", moeSenior.getName());
- assertEquals("Moe Jr.", moeJunior.getName());
+
+ MultiQualifierClient testBean = (MultiQualifierClient) context.getBean("testBean");
+
+ assertNotNull( testBean.factoryTheta);
+ assertNotNull( testBean.implTheta);
+ }
+
+ @Test
+ public void testInterfaceWithOneQualifiedFactoryAndOneQualifiedBean() {
+ StaticApplicationContext context = new StaticApplicationContext();
+ BeanDefinitionReader reader = new XmlBeanDefinitionReader(context);
+ reader.loadBeanDefinitions(CONFIG_LOCATION);
}
@@ -353,4 +361,45 @@ public final class QualifierAnnotationTests {
int age();
}
+
+ private static final String FACTORY_QUALIFIER = "FACTORY";
+
+ private static final String IMPL_QUALIFIER = "IMPL";
+
+
+ public static class MultiQualifierClient {
+
+ @Autowired @Qualifier(FACTORY_QUALIFIER)
+ public Theta factoryTheta;
+
+ @Autowired @Qualifier(IMPL_QUALIFIER)
+ public Theta implTheta;
+ }
+
+
+ public interface Theta {
+ }
+
+
+ @Qualifier(IMPL_QUALIFIER)
+ public static class ThetaImpl implements Theta {
+ }
+
+
+ @Qualifier(FACTORY_QUALIFIER)
+ public static class QualifiedFactoryBean implements FactoryBean {
+
+ public Theta getObject() {
+ return new Theta() {};
+ }
+
+ public Class getObjectType() {
+ return Theta.class;
+ }
+
+ public boolean isSingleton() {
+ return true;
+ }
+ }
+
}