当我使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我在每个子类中都使用了setter注入。这是比自动装配其父母的成员变量更好的做法吗?
这是Spring团队的DI准则:
Spring推荐的一般准则如下(请参阅有关基于构造函数的DI或基于Setter的DI的部分):
对于强制性依赖性或针对不变性,请使用构造函数注入
对于可选或可变的依赖项,请使用setter注入
大多数情况下避免现场注入
现在,如果您确定要使用PaymentService,我建议您像这样在抽象类中使用构造函数注入,这样对象就不会在没有依赖关系的情况下实例化,还使其更不可变,更清晰和线程安全:
abstract class Payment {
PaymentService paymentService;
public Payment(OrderPaymentService paymentService) {
this.paymentService = paymentService;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以像这样在扩展类上直接调用super:
@Component
public class CreatePayment extends Payment{
private OtherService1 otherSerivce1;
@Autowired
public CreatePayment(PaymentService paymentService) {
super(paymentService);
}
}
Run Code Online (Sandbox Code Playgroud)
这仅允许您使用构造函数注入父类(如果paymentService是必需的)。
| 归档时间: |
|
| 查看次数: |
1834 次 |
| 最近记录: |