没有@Qualifier的@AutoWired

时间:2019-05-10 13:21:37

标签: spring spring-boot autowired

如果有两个相同类型但名称不同的bean。是否会在不需要我们在变量上添加@Qualifier的情况下根据名称自动装配bean?我在文档中看到“ 作为回退,Spring使用Bean名称作为默认的限定符值”。

@Component
class A{
}

@Component
class B extends A{
}

class C{

    @AutoWired
    A a;

//Will a be of type class A, even without @Qualifier...?
}

2 个答案:

答案 0 :(得分:0)

在这种情况下,B将被注入,因为Spring有一个A和一个B可供选择,并且其中只有一个与@Autowired字段匹配正在要求(类B,因为A无法分配给B)。

但是,如果您有两个B,则必须使其合格或将其中一个标记为主要。

例如,鉴于此:

@Configuration
public class MyConfig {
    @Bean
    public B example1() {
        return new B();
    }
    @Bean
    public B example2() {
        return new B();
    }
}

好吧,现在您有两个B实例,它们的名称不同。您可以通过以下两种方法之一来解决此问题:

验证您的自动接线资格

请注意,我在这里使用字段注入,您确实应该使用构造函数,这样做是为了节省空间。

 @Component
public class SomeComponent {

    @Autowired
    @Qualifier("example1")
    private B b;

}

将Bean标记为主要

重新定义咖啡豆,将其标记为@Primary

@Configuration
public class MyConfig {
    @Bean
    @Primary // <-------- NEW!
    public B example1() {
        return new B();
    }
    @Bean
    public B example2() {
        return new B();
    }
}

然后注入而无需命名:

 @Component
public class SomeComponent {

    @Autowired  // (Will pick Primary)
    private B b;

}

答案 1 :(得分:0)

  

如果有两个相同类型但名称不同的bean。不用我们在变量上添加@Qualifier的话,就可以根据名称自动装配bean吗?

foreach首先关心类型,之后关心名称。您会得到一个例外,说有多个候选候选对象,而预期只有1个。

@Autowire另一方面,首先关心名称,然后键入。