@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