Spring - 在抽象类级自动装配字段中注入正确的服务实现

时间:2017-11-23 13:18:12

标签: java spring inheritance dependency-injection

我有两个类层次结构:

* ClassA
  * ClassB

* AbstractClass
  * Class1
  * ...
  * Class5

AbstractClass自动装配ClassA如下:

public abstract class AbstractClass {

    @Autowired
    protected ClassA classA;
}

现在我想将ClassA注入Class1,..,Class4实施,但将ClassB注入Class5。我知道我可以通过直接注入实现类而不是抽象类(如Similar Question)来做到这一点,但这意味着我必须将相同的字段声明为一次而不是五次。另外,如果我想在抽象类中使用这个字段,我必须在实现类时强制创建getter并使用它来获取该服务。它有效,但在我看来并不是正确的做法。

1 个答案:

答案 0 :(得分:1)

这是一种方法

@Component
class ClassA {}

@Component
class ClassB extends ClassA {}

abstract class AbstractClass {
    protected ClassA classA;
}

@Component
class Class1 extends AbstractClass {
    public Class1(ClassA classA) {
        this.classA = classA;
    }
}
//... Same for Class2/3/4

@Component
class Class5 extends AbstractClass {
    public Class5(ClassB classB) {
        this.classA = classB;
    }
}

这使您可以在抽象类中拥有公共属性和方法,并且如果使用构造函数注入在子类中限定它们