Spring:自动装配时是否可能有一个具有不同限定符的重复构造函数?

时间:2016-03-25 00:46:32

标签: java spring dependency-injection autowired

我正在尝试使用构造函数在类中自动装配成员。

@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() {
    ...
}

2 个答案:

答案 0 :(得分:0)

在Java的单个类中,您不能拥有两个具有完全相同签名的构造函数。也没有遇到任何其他编程语言。您可以使用方法注入,使用两种方法(当然,命名方式不同),将它们标记为@Autowired(required = false)并使用正确的@Qualifier(...)指定要注入的实例。当弹出上下文中存在两个实例时,您可能希望处理这种情况,因此不会发生意外情况。

答案 1 :(得分:0)

简短的回答是:不,这是不可能的。在Java中,您不能拥有两个具有完全相同签名的构造函数。而且,您只能为“myMember”分配一个值。

但是,你想在这里完成什么?似乎在某些情况下MyClass需要使用“objectA”,而在其他场合,你需要“objectB”。 对于这些场景,您不应该使用自动装配(您不能),而只需使用显式布线:

@Bean
MyClass myObject() {
   return new MyClass(qualifierA());
}