@Qualifier注释不起作用

时间:2017-07-20 06:11:58

标签: spring annotations autowired

我正在尝试使用自动装配DI,我遇到了@Qualifier注释并尝试了以下代码:

Car.java

package beans;

import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.beans.factory.annotation.Qualifier;

public class Car {  

@Autowired
@Qualifier("e1")

private Engine engine;
// no need to have setter or constructor

public void showData(){
    System.out.println("Engine Model Year : "+engine.getModelyear());
}

}

Engine.java

package beans;

public class Engine {
private String modelyear;

public void setModelyear(String modelyear) {
    this.modelyear = modelyear;
}

public String getModelyear() {
    return modelyear;
}

}

Spring.xml

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
            "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
<!-- activate autowire annotation -->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

<bean id="e1" class="beans.Engine">
 <property name="modelyear" value="2017"/>
</bean>

<bean id="e2" class="beans.Engine">
 <property name="modelyear" value="2018"/>
</bean>

<bean id="c" class="beans.Car">

</bean>

</beans>

Main.java

package MainClass;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import beans.Car;

public class AutoAnno_Main {
    public static void main(String[] args) {
        ApplicationContext ap=new ClassPathXmlApplicationContext("resources/spring.xml");
         Car c=(Car)ap.getBean("c");
            c.showData();
    }
}

我得到的错误是:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'beans.Engine' available: expected single matching bean but found 2: e1,e2

这有什么问题我认为语法是正确的,版本有任何问题 我正在使用 eclipse Oxygen

1 个答案:

答案 0 :(得分:0)

您只需在spring.xml中添加<context:annotation-config />即可。除非添加,否则不会激活某些弹簧注释。在您的情况下,如果没有<context:annotation-config />,则Spring不会读取@Qualifier注释。

我已通过添加此测试进行测试,似乎可行。

<强>更新: 你的spring xml需要有弹簧模式来检测<context:annotation-config>。你的最终xml看起来像这样。

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- activate autowire annotation -->

    <context:annotation-config />
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

    <bean id="e1" class="beans.Engine">
        <property name="modelyear" value="2017"/>
    </bean>

    <bean id="e2" class="beans.Engine">
        <property name="modelyear" value="2018"/>
    </bean>

    <bean id="c" class="beans.Car">

    </bean>

</beans>