我有两个类层次结构:
* ClassA
* ClassB
* AbstractClass
* Class1
* ...
* Class5
AbstractClass
自动装配ClassA
如下:
public abstract class AbstractClass {
@Autowired
protected ClassA classA;
}
现在我想将ClassA
注入Class1
,..,Class4
实施,但将ClassB
注入Class5
。我知道我可以通过直接注入实现类而不是抽象类(如Similar Question)来做到这一点,但这意味着我必须将相同的字段声明为一次而不是五次。另外,如果我想在抽象类中使用这个字段,我必须在实现类时强制创建getter并使用它来获取该服务。它有效,但在我看来并不是正确的做法。
答案 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;
}
}
这使您可以在抽象类中拥有公共属性和方法,并且如果使用构造函数注入在子类中限定它们