当我使用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推荐的一般准则(参见基于构造函数的DI或基于Setter的DI部分)如下:
现在,如果你确定你将使用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)。