[英]what is the best way to autowire parent class field in spring?
當我使用 spring 框架時,我發現一些應該提取的東西,例如,服務組件(或自動裝配的成員變量)。 代碼顯示如下:
abstract class Payment {
PaymentService paymentService;
void setPaymentService(OrderPaymentService paymentService) {
this.paymentService = paymentService;
}
}
@Component
public class CancelPayment extends Payment{
private OtherService2 otherSerivce2;
@Autowired
@Override
public void setPaymentService(PaymentService paymentService) {
super.setPaymentService(paymentService);
}
@Autowired
public CancelPayment(OtherService2 s2) {
this.otherSerivce2 = s2;
}
}
@Component
public class CreatePayment extends Payment{
private OtherService1 otherSerivce1;
@Autowired
@Override
public void setPaymentService(PaymentService paymentService) {
super.setPaymentService(paymentService);
}
@Autowired
public CreatePayment (OtherService1 s1) {
this.otherSerivce1 = s1;
}
}
如您所見,我在每個子類中都使用了 setter 注入。 這是比自動裝配其父級成員變量更好的做法嗎?
以下是 Spring 團隊的 DI 指南:
Spring 推薦的一般准則(請參閱基於 Constructor 的 DI 或基於 Setter 的 DI 部分)如下:
對於強制依賴或以不變性為目標時,請使用構造函數注入
對於可選或可變的依賴項,使用 setter 注入
在大多數情況下避免場注入
現在,如果您確定要使用 PaymentService,我建議您像這樣在抽象類中使用構造函數注入,這樣對象就不會在沒有依賴的情況下實例化,也使其更不可變、更清晰和線程安全:
abstract class Payment {
PaymentService paymentService;
public Payment(OrderPaymentService paymentService) {
this.paymentService = paymentService;
}
}
然后你可以簡單地在你的擴展類上調用 super ,如下所示:
@Component
public class CreatePayment extends Payment{
private OtherService1 otherSerivce1;
@Autowired
public CreatePayment(PaymentService paymentService) {
super(paymentService);
}
}
這只是允許您使用構造函數注入父類(如果 paymentService 是強制性的)。
我要提到的第一件事是您應該在繼承之前使用合成,即使使用Spring(僅在特殊情況下),使用繼承也沒有意義。
第二件事是“業務視圖”或用英語怎么說,CancelPayment和CreatePayment在我看來就像是付款服務中的兩種方法,我不明白為什么需要單獨的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.