spring - @Service 注释应该保存在哪里?接口(interface)还是实现?

标签 spring service

我正在使用 Spring 开发应用程序。我需要使用 @Service 注释。我有 ServiceIServiceImpl 以便 ServiceImpl 实现 ServiceI。我很困惑我应该把 @Service 注释放在哪里。

我应该用 @Service 注释接口(interface)还是实现?这两种方法有什么区别?

最佳答案

我从不将@Component(或@Service, ...)放在接口(interface)上,因为这会使接口(interface)无用。让我解释一下原因。

声明 1:如果您有一个接口(interface),那么您想将该接口(interface)用于注入(inject)点类型。

权利要求 2: 接口(interface)的目的是定义可以由多个实现实现的协定。另一方面,您有注入(inject)点 (@Autowired)。只有一个接口(interface)和一个实现它的类,(恕我直言)是无用的,并且违反了YAGNI。 .

事实:当你输入:

  • @Component(或@Service,...)在一个接口(interface),
  • 有多个实现它的类,
  • 至少有两个类成为 Spring Bean,并且
  • 有一个使用接口(interface)进行基于类型的注入(inject)的注入(inject)点,

然后你会得到 NoUniqueBeanDefinitionException (或者你有一个非常特殊的配置设置,包括环境、配置文件或限定符......)

结论:如果你在一个接口(interface)上使用@Component(或@Service,...)那么你必须至少违反一个的两个族群。因此,我认为将 @Component 放在接口(interface)级别是没有用的(除了一些罕见的情况)。


Spring-Data-JPA Repository 接口(interface)完全不同

关于spring - @Service 注释应该保存在哪里?接口(interface)还是实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16351780/

相关文章:

java - 将两种方法合二为一

java - 服务层中的服务组织?

android - 如何停止定时器 Android

java - 无法正确应用其余 Controller junit 测试

javascript - Datatables.net 使用 Spring 进行服务器端分页 : How to select single row's ID?

java - Spring注解@Retryable——如何设置一个拦截器

c# - 我如何在 C# 中等待一段时间(Windows 服务)

java - 开发环境中的spring延迟初始化

c++ - QtService 无法启动

linux - Bash 脚本循环在 If 语句上过早退出