Spring @Qualifier在没有@Primary的情况下也没有工作

时间:2017-08-28 01:09:34

标签: java spring spring-mvc spring-boot

所以,我正在尝试用Spring Boot学习。我试过@Qualifier和@Autowired,但它给了我以下错误:

  

io.cptpackage.springboot.bootdemo.BinarySearch中构造函数的参数0需要一个bean,但是找到了2个:

即使我提供了正确的@Qualifier它也不起作用,直到其中一个依赖项有@Primary注释,名称引用也不起作用我使用@Primary或​​@Qualifier而你知道我遇到了@Qualifier的问题。代码很简单,如下所示。

localhost:5005

第一个依赖:

@Component 
public class BinarySearch {

// Sort, Search, Return the result!
@Autowired
@Qualifier("quick")
Sorter sorter;

public BinarySearch(Sorter sorter) {
    super();
    this.sorter = sorter;
}

public int search(int[] numbersToSearchIn, int targetNumber) {
    sorter.sort(numbersToSearchIn);
    return targetNumber;
 } 
}

第二个依赖:

@Component
@Qualifier("bubble")
public class BubbleSort implements Sorter {

    @Override
    public int[] sort(int[] targetArray) {
        System.out.println("Bubble sort!");
        return targetArray;
    }

}

为什么名称自动装配不起作用?

2 个答案:

答案 0 :(得分:6)

@Qualifier是一个注释,用于指定需要注入的bean,它与@Autowired一起使用。

如果您需要指定组件的名称,只需输入名称@Component("myComponent"),然后在需要注入时使用@Qualifier("myComponent")

对于你的问题,试试这个:

而不是:

@Component
@Qualifier("bubble")
public class BubbleSort implements Sorter {

使用此:

@Component("quick")
public class BubbleSort implements Sorter {

最后定义一种注入bean的方法,例如:

选项1:构造函数参数

@Component 
public class BinarySearch {

// Sort, Search, Return the result!
private final Sorter sorter;

public BinarySearch(@Qualifier("quick")Sorter sorter) {
    super();
    this.sorter = sorter;
}

选项2作为班级成员

@Component 
public class BinarySearch {

// Sort, Search, Return the result!
@Autowired
@Qualifier("quick")
Sorter sorter;

public BinarySearch() {
    super();

}

答案 1 :(得分:3)

使用下面的代码

@Autowired
@Qualifier("quick")

Sorter sorter;

你告诉Spring,分拣机的实例应该符合“快速”bean的要求。 但是在下面的构造函数中:

public BinarySearch(Sorter sorter) {
    super();
    this.sorter = sorter;
}

您没有告知spring应该使用哪个Sorter实例。由于有2个豆限定,所以春天投掷错误。 因此,要么在Sorter arg之前放置@Qualified("quick")注释,要么从构造函数中删除Sorter arg。希望这会有所帮助。