春に親クラスのフィールドをautowireするための最良の方法は何ですか?

王の賞賛:

私はSpringフレームワークを使用する場合、私はエキス、例えば、サービス・コンポーネント(またはautowiredされるメンバ変数)でなければならない何かを見つけます。コードは以下のように示しています。

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;
    }
}

あなたが見ることができるように、私はそれぞれの子クラスでセッター・インジェクションを使用しています。これはautowire親のメンバ変数より良い練習ですか?

IvanM:

ここでは春のチームによるDIのガイドラインは以下のとおりです。


ばねによって推奨される一般的なガイドラインは、(コンストラクタベースDIまたはセッターベースDIのセクションを参照)以下のとおりであります:

  • 必須の依存性または不変性を目指し、使用コンストラクタ・インジェクション用

  • オプションまたは変更の依存関係のために、セッターインジェクションを使用

  • ほとんどの場合避けフィールド注入


あなたはPaymentServiceを使用すると確信している場合今、私はあなたが、オブジェクトので依存せず、またそれをより不変作っていないインスタンス化します。このようなあなたの抽象クラスで明確コンストラクタ・インジェクションを使用することをお勧めし、スレッドセーフになります。

abstract class Payment {
    PaymentService paymentService;


    public Payment(OrderPaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

そして、あなたは、単にこのようなあなたの拡張クラスにスーパー呼び出すことができます。

@Component
public class CreatePayment extends Payment{
    private OtherService1 otherSerivce1;

    @Autowired
    public CreatePayment(PaymentService paymentService) {
        super(paymentService);
    }
}

これは単にあなたは(paymentServiceが必須である場合)、コンストラクタを使用して親クラスを注入することができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=167841&siteId=1