王の賞賛:
私は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が必須である場合)、コンストラクタを使用して親クラスを注入することができます。