如果有两个相同类型但名称不同的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...?
}
答案 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
另一方面,首先关心名称,然后键入。