【问题标题】:How to autowire Spring services that inherit?如何自动装配继承的 Spring 服务?
【发布时间】:2017-11-28 02:21:30
【问题描述】:

我有 2 项服务,即 EFT 和 Check,它们基本相似。

如果我将实现标记为@service,则运行良好。

否则我得到一个没有这样的 bean 定义异常。没有“EftPaymentService”类型的合格 bean。

顶级界面。

public interface PaymentService {
  public void paymentsResponse();
}

Eft 服务接口。

@Service
public interface EftPaymentService extends 
  PaymentService {
   public void processEft(String code) throws PaymentsException;
}

支票服务接口

@Service
public interface ChequePaymentService extends 
  PaymentService {
   public void processCheque(String code) throws PaymentsException;
}

顶层实现

public abstract class PaymentServiceImpl implements PaymentService {
  @Autowired
  protected SessionFactory sftpSessionFactory;

  @Autowired
  protected SftpConfig.UploadGateway gateway;

  public void paymentsResponse(){
  } 
}

Eft 实现

public class EftServiceImpl extends PaymentsServiceImpl implements EftPaymentService {
}

支票实施

public class ChequeServiceImpl extends PaymentsServiceImpl implements ChequePaymentService {
}

这里发生了什么? 使用组合重构?

【问题讨论】:

  • 你检查日志看是否扫描了实现类?
  • 将实现标记为@Service是你应该做的,究竟是什么问题?
  • 是的。您现在找到了问题,剩下的就是阅读答案并理解它们。

标签: java spring inheritance


【解决方案1】:

使用 @Service 注释实现并使用基于构造函数的注入。

【讨论】:

  • 这行得通。在引用接口更通用的基础上对服务进行了注释。在这种情况下它不起作用,尽管我仍然不知道为什么。
  • @Service 只是@Component 的一个特化;它们的行为完全相同。顾名思义,前者传达了一些额外的意图。我相信@Component(因此@Service)的意图是注释Spring“bean”实现,这些实现通常是具体的类,而不是接口。我想我是说我不希望把它放在一个可以工作的界面上。祝你好运。
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 2013-08-22
  • 2015-03-29
  • 1970-01-01
  • 2020-10-05
  • 2017-08-09
相关资源
最近更新 更多