简体   繁体   English

Spring中的@Qualifier注解不起作用

[英]@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM