Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:在自动连接时,是否可能有一个具有不同限定符的重复构造函数?_Java_Spring_Dependency Injection_Autowired - Fatal编程技术网

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,但不知道它们的存在?在不了解实际用例的情况下是不可能说出的。