【问题标题】:Spring @Qualifier isn't working without @Primary [duplicate]没有@Primary,Spring @Qualifier 无法工作 [重复]
【发布时间】:2018-02-05 05:33:40
【问题描述】:

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

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

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

@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;
    }

}

第二个依赖:

@Component
@Qualifier("quick")
public class QuickSort implements Sorter {

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

}

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

【问题讨论】:

    标签: java spring spring-mvc spring-boot


    【解决方案1】:

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

    你需要指定一个组件的名称,只需输入一个名称@Component("myComponent"),然后当你需要注入它时使用@Qualifier("myComponent")

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

    代替:

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

    使用这个:

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

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

    选项一:构造函数参数

    @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();
    
    }
    

    【讨论】:

    • 我之前已经这样做了,但是如果我没有将 @Primary 注释放在 Quick 或 Bubble 两个依赖项中的任何一个中,我仍然会收到以下错误。线程“主”org.springframework.beans.factory.UnsatisfiedDependencyException 中的异常:创建文件中定义的名称为“binarySearch”的 bean 时出错:通过构造函数参数 0 表示的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有“io.cptpackage.springboot.bootdemo.Sorter”类型的合格 bean 可用:预期单个匹配 bean,但找到 2:气泡,快速
    • 是的,这是因为quick 组件是使用构造函数并作为成员类注入的。只需使用一种方法注入,例如,您可以像这样public BinarySearch() { 从输入参数构造函数中删除排序器
    • 您也可以将其作为构造函数参数注入,但在这种情况下,删除 Autowired 和限定符表单 Sorter sorter; 并将限定符放入构造函数中,如下所示 public BinarySearch(@Qualifier("quick") Sorter sorter) {
    • 好吧,没有自动装配的方式工作,但是如果我想使用没有主要限定符注释的自动装配并按照我的方式指定它怎么办?为什么按名称自动装配不起作用?很抱歉问题量很大,但我仍在学习。
    • 没关系,您可以根据需要多次使用@Qualifier@Primary 只是定义default 注入的注解,只是为了告诉spring 如何决定注入什么bean。 @Autowired 也可以工作,但在您的示例中,它与构造函数参数不匹配,因为默认情况下,即使您不将 @Autowired 放入构造函数,spring 也会处理 @Component 的参数构造函数,spring 会尝试将其注入构造函数参数以及@Autowired 成员
    【解决方案2】:

    使用下面的代码

    @Autowired
    @Qualifier("quick")
    
    Sorter sorter;
    

    您是在告诉 spring,sorter 的实例应该符合“快速”bean 的条件。 但在下面的构造函数中:

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

    您没有通知 spring 应该使用哪个 Sorter 实例。由于有 2 个 bean 符合此条件,因此 spring 抛出错误。 因此,要么将 @Qualified("quick") 注释放在 Sorter arg 之前,要么从构造函数中删除 Sorter arg。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2021-06-10
      • 2016-10-25
      • 2019-06-29
      • 1970-01-01
      • 2018-07-04
      • 2021-06-08
      相关资源
      最近更新 更多