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; + } + } + }