@Service 注解应该放在哪里?接口还是实现?

新手上路,请多包涵

我正在使用 Spring 开发应用程序。我需要使用 @Service 注释。我有 ServiceIServiceImpl 这样 ServiceImpl implements ServiceI 。我很困惑我应该在哪里保留 @Service 注释。

我应该用 @Service 注释接口或实现吗?这两种方法有什么区别?

原文由 TheKojuEffect 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.3k
2 个回答

我从来没有把 @Component (或 @Service ,…)放在接口上,因为这会使接口无用。让我解释一下为什么。

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

声明 2: 接口的目的是它定义了一个可以由多个实现实现的契约。在另一边你有你的注入点( @Autowired )。只有一个接口和一个实现它的类,(恕我直言)是无用的,并且违反了 YAGNI

事实: 当你把:

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

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

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


Spring-Data-JPA Repository 接口完全不同

原文由 Ralph 发布,翻译遵循 CC BY-SA 3.0 许可协议

基本上像 @Service@Repository@Component 等注解。它们都服务于相同的目的:

使用基于注释的配置和类路径扫描时的自动检测。

根据我的经验,我总是在接口或抽象类上使用 @Service 注释以及 @Component@Repository 等注释来实现它们。 @Component 我在那些服务于基本目的的类上使用的注释,简单的 Spring bean,仅此而已。 @Repository 我在 DAO 层中使用的注释,例如,如果我必须与数据库通信,进行一些交易等。

因此,我建议根据功能使用 @Service 和其他层来注释您的界面。

原文由 Paulius Matulionis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题