Java Spring:在自动连接时,是否可能有一个具有不同限定符的重复构造函数?
我正在尝试使用构造函数自动关联类中的成员Java Spring:在自动连接时,是否可能有一个具有不同限定符的重复构造函数?,java,spring,dependency-injection,autowired,Java,Spring,Dependency Injection,Autowired,我正在尝试使用构造函数自动关联类中的成员 @Component public class MyClass { private ClassA myMember; @Autowire public MyClass(ClassA objectA) { myMember = objectA; } } 如果我有多个创建ClassA bean的源,那么有可能有一个重复的构造函数定义,它基于自动连接到这个类中的bean进行实例化吗 我想这样做: @C
@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定义如下,如何基于名称(qualifier a
)或(qualifier b
)消除歧义:
@Bean (name = "qualifierA")
public ClassA getQualifierA() {
...
}
@Bean (name = "qualifierB")
public ClassA getQualifierB() {
...
}
在Java中,一个类中不能有两个具有完全相同签名的构造函数。也不是我遇到过的任何其他编程语言。您可以使用方法注入,使用两个方法(当然名称不同),将它们标记为
@Autowired(required=false)
,并使用适当的@限定符(…)
来指定要注入的实例。您可能希望处理两个实例都出现在spring上下文中的情况,这样就不会发生意外情况。简短的回答是:不,这是不可能的。在Java中,不能有两个具有完全相同签名的构造函数。而且,您只能为“myMember”指定一个值
然而,你想在这里完成什么?似乎在某些情况下MyClass需要使用“objectA”,而在其他情况下,您需要使用“objectB”。
对于这些场景,不应使用自动布线(不能),而应使用显式布线:
@Bean
MyClass myObject() {
return new MyClass(qualifierA());
}
您是否尝试过注释
@Autowired@Qualifier(“Qualifier A”)
和@Autowired@Qualifier(“Qualifier B”)
?是的,但这也不起作用。为什么要尝试用两个不同的构造函数自动关联一个字段?一个字段怎么可能有两个不同的值?也许你只是想使用@Profile
s,但不知道它们的存在?在不了解实际用例的情况下是不可能说出的。