@Service注解应该放在哪里?接口或实现类中?

13 浏览
0 Comments

@Service注解应该放在哪里?接口或实现类中?

我正在使用Spring开发应用程序。 我需要使用 @ Service 注释。 我有 ServiceI ServiceImpl ,使得 ServiceImpl实现了ServiceI 。 在此,我困惑于应在哪里放置 @ Service 注释。

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

admin 更改状态以发布 2023年5月23日
0
0 Comments

基本上,像@Service@Repository@Component等这些注解,它们的作用都是:

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

从我的经验来看,我总是在接口或抽象类上使用@Service注解,并在实现中使用@Component@Repository注解。@Component注解我用于那些提供基本功能的类,简单的Spring bean,仅此而已。@Repository注解我用在DAO层中,例如如果我需要与数据库通信,进行一些事务处理等。

因此,我建议根据功能对接口进行@Service注解以及其他的层进行注解。

0
0 Comments

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

论述1:如果你有一个接口,那么你想要将该接口用作注入点类型。

论述2:接口的目的是定义一个可以由多个实现执行的合同。另一方面,您有您的注入点(@Autowired)。只有一个接口和只有一个实现它的类,是(以我个人的看法)没有用的,而且违反了YAGNI(不编写不需要的代码)原则。

事实:当您在接口上放置:

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

那么你就会得到一个NoUniqueBeanDefinitionException(除非您有非常特殊的配置设置,使用环境,profiles或qualifiers...)

结论:如果您在接口级别使用@Component(或@Service, ...),那么您必须违反以上两个论述中的至少一个。因此,我认为在接口级别放置@Component是没有用的(除了一些罕见的场景)。


Spring-Data-JPA Repository接口是完全不同的事情

0