我有一个抽象类,它自动装配一些 bean,例如一个存储库:public abstract class A { @Autowired private ARepository aRepository; protected void useRepository() { aRepository.doSomething(); }}这个抽象类使用该存储库来处理某些方法。现在我还有一个子类,它扩展类A并且还有一个方法,它使用ARepository.public class B extends A { private void useRepositoryAgain() { aRepository.doSomething(); }}现在我的问题:我怎么看有两种方法可以做到这一点:1:B再次在课堂上自动装配存储库:public class B extends A { @Autowired private ARepository aRepository; ...}2:在A类中创建getter方法:public abstract class A { ... public ARepository getARepository() { return this.aRepository; }}public class B extends A { private void useRepositoryAgain() { getARepository().doSomething(); }}根据我的理解,两者之间应该没有区别,因为再次自动装配存储库只会返回它的相同实例。我的理解是否正确,或者我缺少的两种方法之间是否存在显着差异?
1 回答
SMILET
TA贡献1796条经验 获得超4个赞
再次自动装配 bean 将不起作用。它会导致aRepository类中的成员变量A为null. Spring 只会在类中自动装配成员变量,B而不会在A.
相反,只在 classA而不是在 class 中自动装配它B,并使它protected而不是private在 class 中,A以便子类中的方法B也可以访问它:
public abstract class A {
@Autowired
protected ARepository aRepository;
protected void useRepository() {
aRepository.doSomething();
}
}
public class B extends A {
private void useRepositoryAgain() {
// Fine, since aRepository is protected in the superclass
aRepository.doSomething();
}
}
添加回答
举报
0/150
提交
取消