【发布时间】:2019-04-03 03:50:12
【问题描述】:
当我使用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 注入。这是否比自动装配其父级成员变量更好?
【问题讨论】:
-
您在此处展示的基本思想或结构没有问题,但存在具体问题。您将三个 PaymentService 对象自动装配到同一个组件中。您如何期望 Spring 知道它应该在每个点注入哪些不同类型的 PaymentService bean?我假设您不希望将同一个 bean 注入所有三个注入点,但这就是 Spring 可以对您显示的代码所做的全部。要么你只有一个 PaymentService 对象,要么 Spring 不会喜欢这个代码。
-
...如果您注册了多个 PaymentService bean,请相信 Spring 会抱怨它有太多 PaymentService 类型的候选 bean,因此不知道该怎么做。 - 有一些方法可以解决这个问题,比如 @Qualifier 注释。
-
在子级和父级都定义 paymentService 变量也很奇怪,而且我不确定是否合法。我不确定您认为这对于调用超类的 setter 的 setter 方法意味着什么,但您的构造函数直接设置值。充其量,这是非常令人困惑的。
-
@Steve 对不起,在子级和父级都定义支付服务,这是一个笔误。我只会在父母中保留它
-
如果不需要子特定的支付服务,那么在 Parent 中定义并继承它似乎 更干净?