我正在尝试使用 @qualifier 自动装配我的 bean,但即使在添加限定符之后,我也会收到“required single bean”异常

pra*_*ddy 0 qualifiers autowired spring-boot

BubbleSort.java 该类实现SortAlgorithm接口

package com.prakash.Spring.Example;

import org.springframework.stereotype.Component;

@Component
@Qualifier("bubbleSort")
public class BubbleSort implements SortAlgorithm {

    public void sort() {
        System.out.println("Sort from Bubble Sort");
    }
}
Run Code Online (Sandbox Code Playgroud)

QuickSort.java 该类实现了SortAlgorithm接口包com.prakash.Spring.Example;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.context.annotation.Primary;

import org.springframework.stereotype.Component;

@Component
@Qualifier("quickSort")
public class QuickSort implements SortAlgorithm {

    @Override
    public void sort() {
        System.out.println("Sort from Quick Sort");
    }

}
Run Code Online (Sandbox Code Playgroud)

排序算法.java

package com.prakash.Spring.Example;

public interface SortAlgorithm {
 void sort();
}
Run Code Online (Sandbox Code Playgroud)

BinarySearch.java 在这个类中,我想使用 fastSort bean 作为我的组件。

package com.prakash.Spring.Example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class BinarySearch {

    @Autowired
    @Qualifier("quickSort")
    private SortAlgorithm sortAlgorithm;

    public BinarySearch(SortAlgorithm sortAlgorithm) {
        super();
        this.sortAlgorithm = sortAlgorithm;
    }

    public int[] search(int[] numbers) {
        sortAlgorithm.sort();
        System.out.println("This is from BinarySearch");
        return numbers;
    }
}
Run Code Online (Sandbox Code Playgroud)

ComplexBusinessService.java 在这个类中,我使用 getBean 方法获取 bean

package com.prakash.Spring.Example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class ComplexBussinessService {

    public static void main(String[] args) {

        ConfigurableApplicationContext applicationContext = SpringApplication.run(ComplexBussinessService.class, args);
        BinarySearch binarySearch = applicationContext.getBean(BinarySearch.class);
        int[] result = binarySearch.search(new int[] { 2, 4, 3 });
        for (int i : result) {
            System.out.print(i+" ");
        }
        applicationContext.close();

    }
}
Run Code Online (Sandbox Code Playgroud)

RUA*_*ult 5

这就是原因。实际上,这是 Spring 的棘手部分,了解依赖注入何时以及如何发生。

这是依赖注入的顺序:

  1. 使用类的构造函数注入
  2. 注入字段(用 注释@Autowired
  3. 注入 setter(也用 注释@Autowired

技巧就在这里:
如果一个被注释的类@Component也只有一个非默认构造函数,那么这个构造函数会被自动调用。当您首先调用构造函数,然后调用字段时,@QualifierSpring 甚至不会解释您的字段,因为它在构造函数调用期间失败,因此出现异常。

要解决这个问题,您有两种选择:

  1. 或者,从 中删除您的构造函数BinarySearch。然后 Spring 将调用默认构造函数new BinarySearch(),然后sortAlgorithm使用@Qualifier.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class BinarySearch {

    @Autowired
    @Qualifier("quickSort")
    private SortAlgorithm sortAlgorithm;

    public int[] search(int[] numbers) {
        sortAlgorithm.sort();
        System.out.println("This is from BinarySearch");
        return numbers;
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 或者删除字段的注释并@Qualifier在构造函数参数中添加 a :
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class BinarySearch {

    private SortAlgorithm sortAlgorithm;

    public BinarySearch(@Qualifier("quickSort") SortAlgorithm sortAlgorithm) {
        super();
        this.sortAlgorithm = sortAlgorithm;
    }

    public int[] search(int[] numbers) {
        sortAlgorithm.sort();
        System.out.println("This is from BinarySearch");
        return numbers;
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 !

  • 有效。现在我明白得更清楚了。感谢您的帮助。 (2认同)