我正在使用 Spring 开发应用程序。我需要使用 @Service
注释。我有 ServiceI
和 ServiceImpl
以便 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/