在春天自动装配父类字段的最佳方法是什么?

问题描述 投票:4回答:1

当我使用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注入。这是一个很好的做法,可以自动装配其父成员变量吗?

java spring
1个回答
3
投票

以下是Spring团队的DI指南:


Spring推荐的一般准则(参见基于构造函数的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)。

© www.soinside.com 2019 - 2024. All rights reserved.