@Service注解应该放在哪里?接口或实现类中?
@Service注解应该放在哪里?接口或实现类中?
我正在使用Spring开发应用程序。 我需要使用 @ Service
注释。 我有 ServiceI
和 ServiceImpl
,使得 ServiceImpl实现了ServiceI
。 在此,我困惑于应在哪里放置 @ Service
注释。
我应该在接口或实现中使用 @ Service
注释吗? 这两种方法之间有什么区别?
基本上,像@Service,@Repository,@Component等这些注解,它们的作用都是:
自动检测,当使用基于注解的配置和类路径扫描时。
从我的经验来看,我总是在接口或抽象类上使用@Service
注解,并在实现中使用@Component
和@Repository
注解。@Component
注解我用于那些提供基本功能的类,简单的Spring bean,仅此而已。@Repository
注解我用在DAO
层中,例如如果我需要与数据库通信,进行一些事务处理等。
因此,我建议根据功能对接口进行@Service
注解以及其他的层进行注解。
我从不在接口上使用@Component
(或@Service
, ...),因为这会使接口无用。让我解释一下为什么。
论述1:如果你有一个接口,那么你想要将该接口用作注入点类型。
论述2:接口的目的是定义一个可以由多个实现执行的合同。另一方面,您有您的注入点(@Autowired
)。只有一个接口和只有一个实现它的类,是(以我个人的看法)没有用的,而且违反了YAGNI(不编写不需要的代码)原则。
事实:当您在接口上放置:
@Component
(或@Service
, ...),- 有多个类实现它,
- 至少有两个类成为Spring Bean,
- 有一个注入点使用接口进行类型注入,
那么你就会得到一个NoUniqueBeanDefinitionException
(除非您有非常特殊的配置设置,使用环境,profiles或qualifiers...)
结论:如果您在接口级别使用@Component
(或@Service
, ...),那么您必须违反以上两个论述中的至少一个。因此,我认为在接口级别放置@Component
是没有用的(除了一些罕见的场景)。
Spring-Data-JPA Repository接口是完全不同的事情