@Repository 注释的真正目的[重复]
Posted
技术标签:
【中文标题】@Repository 注释的真正目的[重复]【英文标题】:Real purpose of @Repository annotations [duplicate] 【发布时间】:2019-10-23 06:32:53 【问题描述】:在 Spring 中,我们有 @Componenet
、@Repository
注释。我研究了一些东西,发现@Component
和另一个之间有以下区别。
@Repository
注释是任何满足存储库角色或原型(也称为数据访问对象或 DAO)的类的标记。
我的困惑是如果我们用@Component
替换@Repository
,我们会得到任何错误(我怀疑)。如果是这样,是否有可能通过使用@Component
+ 一些手动配置(我们称之为样板代码)来实现存储库的原型/功能。我问这个只是为了更好地理解这个概念。
跨博客发布的第二个主要意义是,如果我们使用基于层的注释,如@Service
、@Controller
、@Repository
,异常处理会更好。但找不到很好的解释或例子。
【问题讨论】:
请阅读:baeldung spring-component-repository-service 和 baeldung spring-component-scanning "如果我们用@ComponentScan 替换@Repository" 你永远不会那样做,因为@ComponentScan
与@Repository
不同,@Component
是。 @ComponentScan
注释用于定义哪些 类应扫描@Component
注释类和使用类似派生注释注释的类,如@Controller
、@Service
和@Repository
。
@Andreas 是的,我的意思是组件。我已经编辑了这个问题,写的时候很困惑。
1a) “我们是否有任何错误” 没有。--- 1b) “任何实现刻板印象/功能的可能性” 是的。 --- 2) 只有@Repository
会自动翻译异常。其他人没有。
【参考方案1】:
来自Spring Framework Documentation:
Spring 提供了更多的原型注解:@Component、@Service 和 @Controller。 @Component 是任何 Spring 管理的组件的通用构造型。 @Repository、@Service 和 @Controller 是 @Component 针对更具体的用例(分别在持久层、服务层和表示层)的特化。因此,您可以使用@Component 注释您的组件类,但是通过使用@Repository、@Service 或@Controller 注释它们,您的类更适合工具处理或与方面关联。例如,这些原型注释是切入点的理想目标。 @Repository、@Service 和 @Controller 还可以在 Spring 框架的未来版本中携带额外的语义。因此,如果您选择使用@Component 或@Service 作为服务层,@Service 显然是更好的选择。同样,如前所述,@Repository 已被支持作为持久层中自动异常转换的标记。
这意味着它们在那里,因此您可以使用它们来指示功能。 @Service
用于服务,@Repository
用于存储库等。我们这样做是为了更容易识别被修饰代码的意图。它在定义方面时也很有帮助(如面向方面的编程),所以我们可以说“所有存储库都应该有 X 切入点”,而不必拼写出包或任何东西。我们只需要寻找@Repository
注释。
我以前对我的课程进行了错误分类(使用@Component
代替@Service
)并且从未遇到任何问题。但这并不是说不会有问题,尤其是当 Spring 或其他一些库将它们用于 AOP 时。
【讨论】:
以上是关于@Repository 注释的真正目的[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Spring 注释:@Component 有效,@Repository 无效
Spring - 使用@Service和@Repository注释同一个类
Spring @Repository 注释不起作用,但 @Service 注释起作用?
一个类可以同时注释为@Repository 和@Entity 吗?
扩展 CrudRepository (Spring) 时是不是需要 @Repository 注释?
关于 yum 的 Error: Cannot retrieve metalink for repository: epel