簡體   English   中英

在 spring 中自動裝配父類字段的最佳方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM