我有一個抽象類,它自動裝配一些 bean,例如一個存儲庫:public abstract class A { @Autowired private ARepository aRepository; protected void useRepository() { aRepository.doSomething(); }}這個抽象類使用該存儲庫來處理某些方法?,F(xiàn)在我還有一個子類,它擴展類A并且還有一個方法,它使用ARepository.public class B extends A { private void useRepositoryAgain() { aRepository.doSomething(); }}現(xiàn)在我的問題:我怎么看有兩種方法可以做到這一點:1:B再次在課堂上自動裝配存儲庫:public class B extends A { @Autowired private ARepository aRepository; ...}2:在A類中創(chuàng)建getter方法:public abstract class A { ... public ARepository getARepository() { return this.aRepository; }}public class B extends A { private void useRepositoryAgain() { getARepository().doSomething(); }}根據(jù)我的理解,兩者之間應(yīng)該沒有區(qū)別,因為再次自動裝配存儲庫只會返回它的相同實例。我的理解是否正確,或者我缺少的兩種方法之間是否存在顯著差異?
1 回答

SMILET
TA貢獻1796條經(jīng)驗 獲得超4個贊
再次自動裝配 bean 將不起作用。它會導(dǎo)致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
提交
取消