Spring中的@Qualifier注释不起作用

Dan*_*ick 5 java spring spring-mvc

我刚刚学习了Spring Framework,并一直在使用Spring 2.5进行学习。我用这些类创建了三个bean

Food.java

package com.spring.danipetrick;

public interface Food {
    void ingredients(); 
}
Run Code Online (Sandbox Code Playgroud)

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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...");
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

最后,具有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();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行该项目时,出现这样的错误

由以下原因引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义[com.spring.danipetrick.Food]类型的唯一bean:期望的单个匹配bean,但找到了2:[rendang,nasigoreng]

为什么@Qualifier注释在我的情况下不起作用?

Sot*_*lis 5

方法和字段都用注释@Autowired。因此,Spring将尝试同时注入两者。在一次运行中,它将尝试注入

@Autowired
@Qualifier("nasigoreng")
private Food food;
Run Code Online (Sandbox Code Playgroud)

这将起作用,因为注射目标合格。

但是方法

@Autowired
public void setFood(Food food) {
    this.food = food;
}
Run Code Online (Sandbox Code Playgroud)

不符合注入参数的条件,因此Spring不知道要注入哪个bean。

将以上更改为

@Autowired
public void setFood(@Qualifier("nasigoreng") Food food) {
    this.food = food;
}
Run Code Online (Sandbox Code Playgroud)

但是您应该决定是现场注入还是二传手注入中的一种,否则是多余的,可能会导致错误。


San*_*mar 3

尝试仅从@AutowiredinsetFood()中删除PecintaKuliner

喜欢

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

public void setFood(Food food) {
    this.food = food;
}
Run Code Online (Sandbox Code Playgroud)