我正在尝试使用构造函数在类中自动装配成员。
@Component
public class MyClass {
private ClassA myMember;
@Autowire
public MyClass(ClassA objectA) {
myMember = objectA;
}
}
如果我有多个创建ClassA bean的源,是否有可能有一个重复的构造函数定义,该定义基于自动装入此类的bean进行实例化?
我想做这样的事情:
@Component
public class MyClass {
private ClassA myMember;
@Autowire
public MyClass(@Qualifier ("qualifierA") ClassA objectA) {
myMember = objectA;
}
@Autowire
public MyClass(@Qualifier ("qualifierB") ClassA objectB) {
myMember = objectB;
}
}
我尝试以这种方式使用@Qualifier
,但它没有用。
使用Spring可以做我想做的事情吗?如果bean定义如下,我如何根据名称(qualifierA
)或(qualifierB
)消除歧义:
@Bean (name = "qualifierA")
public ClassA getQualifierA() {
...
}
@Bean (name = "qualifierB")
public ClassA getQualifierB() {
...
}
答案 0 :(得分:0)
在Java的单个类中,您不能拥有两个具有完全相同签名的构造函数。也没有遇到任何其他编程语言。您可以使用方法注入,使用两种方法(当然,命名方式不同),将它们标记为@Autowired(required = false)
并使用正确的@Qualifier(...)
指定要注入的实例。当弹出上下文中存在两个实例时,您可能希望处理这种情况,因此不会发生意外情况。
答案 1 :(得分:0)
简短的回答是:不,这是不可能的。在Java中,您不能拥有两个具有完全相同签名的构造函数。而且,您只能为“myMember”分配一个值。
但是,你想在这里完成什么?似乎在某些情况下MyClass需要使用“objectA”,而在其他场合,你需要“objectB”。 对于这些场景,您不应该使用自动装配(您不能),而只需使用显式布线:
@Bean
MyClass myObject() {
return new MyClass(qualifierA());
}