java - Spring 中的 @Qualifier 注解不起作用

标签 java spring spring-mvc

刚刚学习了Spring Framework,本次学习一直使用Spring 2.5。我用这些类创建了三个 bean

食物.java

package com.spring.danipetrick;

public interface Food {
    void ingredients(); 
}

炒饭.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

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

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配置,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>

最后,带有 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();
    }
}

当我运行这个项目时,我有这样的错误

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]

为什么@Qualifier 注解在我的案例中不起作用?

最佳答案

您的方法和字段都带有 @Autowired 注释。因此,Spring 将尝试注入(inject)两者。在其中一次运行中,它将尝试注入(inject)

@Autowired
@Qualifier("nasigoreng")
private Food food;

这将起作用,因为注入(inject)目标是合格的。

不过方法

@Autowired
public void setFood(Food food) {
    this.food = food;
}

没有限定注入(inject)参数,因此 Spring 不知道要注入(inject)哪个 bean。

将上面的改成

@Autowired
public void setFood(@Qualifier("nasigoreng") Food food) {
    this.food = food;
}

但是你应该选择一个或另一个,字段注入(inject)或setter注入(inject),否则它是多余的并且可能导致错误。

关于java - Spring 中的 @Qualifier 注解不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20159220/

相关文章:

java - 如何解决 tomcat 的问题? Spring 启动 "Failed to scan"

java - 带有继承的 JPA ManyToOne 映射

java - 使用 Java 在 Apache Spark 中的数据集的单列上应用函数

java - Spring集成流程: perform task within flow

java - Spring 形式的对象字段

java - 如何获取 1 :M entity from parent class with limit?

java - libGDX:如何正确地将屏幕加载到内存中?

java - Spring:缺少 JPA 元模型

java - 通过接口(interface)公开单例类的正确方法

java - Spring mvc Ehcache问题