[英]@Qualifier Annotation in Spring is not working
I have just learnt Spring Framework and have been using Spring 2.5 for this learning.我刚刚学习了 Spring Framework,并且一直在使用 Spring 2.5 进行学习。 I have created three beans with these classes
我用这些类创建了三个 bean
Food.java食物.java
package com.spring.danipetrick;
public interface Food {
void ingredients();
}
NasiGoreng.java NasiGoreng.java
package com.spring.danipetrick;
public class NasiGoreng implements Food {
public NasiGoreng() {
}
public void ingredients() {
System.out.println("Rice, Coconut oil, Egg, Crackers");
}
@Override
public String toString() {
return "Nasi Goreng";
}
}
Rendang.java仁当.java
package com.spring.danipetrick;
public class Rendang implements Food {
public void ingredients() {
System.out.println("Beef, Coconut milk, spices");
}
@Override
public String toString() {
return "Rendang";
}
}
PecintaKuliner.java PecintaKuliner.java
package com.spring.danipetrick;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class PecintaKuliner {
@Autowired
@Qualifier("nasigoreng")
private Food food;
@Autowired
public void setFood(Food food) {
this.food = food;
}
public Food getFood() {
return this.food;
}
public void sayMaknyus() {
System.out.println(food.toString() + " memang maknyus...");
}
}
Xml configuration, qualifier-test.xml xml配置,qualifier-test.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
<bean id="bondan" class="com.spring.danipetrick.PecintaKuliner">
</bean>
<bean id="rendang" class="com.spring.danipetrick.Rendang"/>
<bean id="nasigoreng" class="com.spring.danipetrick.NasiGoreng" />
</beans>
Finally, class with main method is QualifierTestMain.java:最后,具有 main 方法的类是 QualifierTestMain.java:
package com.spring.danipetrick;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class QualifierTestMain {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("/qualifier-test.xml");
PencintaKuliner bondan = (PencintaKuliner)context.getBean("bondan");
bondan.sayMaknyus();
}
}
When I run this project, I have an error like this当我运行这个项目时,我有一个这样的错误
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.spring.danipetrick.Food] is defined: expected single matching bean but found 2: [rendang, nasigoreng]
引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义类型 [com.spring.danipetrick.Food] 的唯一 bean:预期单个匹配 bean,但找到 2:[rendang,nasigoreng]
Why @Qualifier annotation is not working in my case?为什么 @Qualifier 注释在我的情况下不起作用?
Both your method and field are annotated with @Autowired
.您的方法和字段都使用
@Autowired
注释。 As such, Spring will try to inject both.因此,Spring 将尝试注入两者。 On one of the runs, it will try to inject
在其中一次运行中,它将尝试注入
@Autowired
@Qualifier("nasigoreng")
private Food food;
which will work because the injection target is qualified.这将起作用,因为注入目标是合格的。
The method however方法不过
@Autowired
public void setFood(Food food) {
this.food = food;
}
does not qualify the injection parameter so Spring doesn't know which bean to inject.不限定注入参数,因此 Spring 不知道要注入哪个 bean。
Change the above to将上述更改为
@Autowired
public void setFood(@Qualifier("nasigoreng") Food food) {
this.food = food;
}
But you should decide one or the other, field or setter injection, otherwise it is redundant and may cause errors.但是你应该决定一个或另一个,字段或setter注入,否则它是多余的并且可能导致错误。
I tried with Spring 4.2.4.我尝试使用 Spring 4.2.4。 Problem resolved just by adding
<context:annotation-config />
in configuration file.只需在配置文件中添加
<context:annotation-config />
即可解决问题。
Try only removing @Autowired
from setFood()
in PecintaKuliner
尝试仅从 PecintaKuliner 的
PecintaKuliner
setFood()
中删除@Autowired
like喜欢
@Autowired
@Qualifier("nasigoreng")
private Food food;
public void setFood(Food food) {
this.food = food;
}
Try removing you constructor from the NasiGoreng class.尝试从 NasiGoreng 类中删除您的构造函数。 It worked for me.
它对我有用。
For others facing issue in Spring 5 -- Use xmlns based configuration..对于 Spring 5 中面临的其他问题——使用基于 xmlns 的配置..
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.