为什么我们需要在服务实现中使用@service
并在DAO实施中使用@repository
。在spring MVC中交换@service
和@repository
注释时没有问题。
答案 0 :(得分:7)
根据documentaion @Repository
,@Service
,@Controller
都是同义词。它们都只是@Component
注释的特化。因此,一般来说,它们可以用于其他一种。但是......你不应该这样做。
第一个原因:任何此注释都会明确您的组件在应用程序中的作用。显示 - 此组件属于控制器,服务或数据层。
第二个原因:一些注释由不同的Spring模块处理不同。例如,Spring Data JPA
将处理@Repository
,并将尝试用实现替换此注释标记的任何接口。 Spring还将对这些类应用自动异常转换。另一个例子是Spring Web MVC
进程@Controller
,并在URL映射中使用标记它的类。
实际上,在将来的版本中,Spring的某些模块可以以特定方式处理@Service
。不那么简单@Component
。这就是文档建议的原因:
@ Repository,@ Service和@Controller也可能 在Spring Framework的未来版本中携带额外的语义。 因此,如果您在使用@Component或@Service之间进行选择 你的服务层,@ Service显然是更好的选择。
答案 1 :(得分:1)
这取决于您对框架其余部分使用的内容。理论上,由于@Service
和@Repository
注释基本上是@Component
注释,因此没有任何变化。 @Controller
或@Endpoint
也是如此(对于Spring Ws而且还有更多)。
然而,它们表达了类(服务,存储库)的意图,并使用户清楚该类属于哪个层。
但是,如果您还使用Spring进行事务管理,那么@Repository
也是该类adding exception translation的触发器(另请参阅reference guide)。
虽然没有 可以打破它,但可能会在某个时候。