【问题标题】:Real purpose of @Repository annotations [duplicate]@Repository 注释的真正目的[重复]
【发布时间】:2019-10-23 06:32:53
【问题描述】:

在 Spring 中,我们有 @Componenet、@Repository 注释。我研究了一些东西,发现@Component 和另一个之间有以下区别。

@Repository 注释是任何满足存储库角色或原型(也称为数据访问对象或 DAO)的类的标记。

  1. 我的困惑是如果我们用@Component 替换@Repository,我们会得到任何错误(我怀疑)。如果是这样,是否有可能通过使用@Component + 一些手动配置(我们称之为样板代码)来实现存储库的原型/功能。我问这个只是为了更好地理解这个概念。

  2. 跨博客发布的第二个主要意义是,如果我们使用基于层的注释,如@Service、@Controller、@Repository,异常处理会更好。但找不到很好的解释或例子。

【问题讨论】:

  • "如果我们用@ComponentScan 替换@Repository" 你永远不会那样做,因为@ComponentScan 与@Repository 不同,@Component 是。 @ComponentScan 注释用于定义哪些 类应扫描@Component 注释类和使用类似派生注释注释的类,如@Controller、@Service 和@Repository。
  • @Andreas 是的,我的意思是组件。我已经编辑了这个问题,写的时候很困惑。
  • 1a) “我们是否有任何错误” 没有。--- 1b) “任何实现刻板印象/功能的可能性” 是的。 --- 2) 只有@Repository 会自动翻译异常。其他人没有。

标签: java spring spring-boot spring-mvc


【解决方案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 时。

【讨论】:

    猜你喜欢
    • 2013-03-09
    • 2016-02-02
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2012-11-24
    • 2014-09-12
    相关资源
    最近更新 更多