【问题标题】:What will happen if we interchange @service and @repository annotation in the spring MVC如果我们在spring MVC中互换@service和@repository注解会发生什么
【发布时间】:2016-05-28 18:00:29
【问题描述】:

为什么我们需要在服务实现中使用@service,在DAO 实现中使用@repository。我在spring MVC中互换@service@repository注解没有问题。

【问题讨论】:

  • 这可能会搞砸你的交易。服务需要将需要传播的事务传递给 DAO。两者都是组件,因此创建 bean 不会成为问题。

标签: java spring spring-mvc annotations


【解决方案1】:

根据documentaion@Repository,@Service,@Controller都是同义词。它们都只是 @Component 注释的特化。所以,一般来说,它们可以用一种代替另一种。但是……你不应该这样做。

第一个原因:这些注释中的任何一个明确了您的组件在应用程序中的角色。 Shows - 这个组件是属于控制器、服务还是数据层。

第二个原因:其中一些注解被不同的 Spring 模块以不同方式处理。例如,Spring Data JPA 将处理 @Repository 并尝试用实现替换此注释标记的任何接口。 Spring 还将对此类类应用自动异常转换。另一个例子:Spring Web MVC 处理 @Controller,并在 URL 映射中使用标有它的类。

实际上,在未来的版本中,Spring 的某些模块可以以特定方式处理@Service。不是那么简单的@Component。这就是文档建议的原因:

@Repository、@Service 和 @Controller 也有可能 在 Spring Framework 的未来版本中携带额外的语义。 因此,如果您在使用 @Component 或 @Service 之间进行选择 你的服务层,@Service 显然是更好的选择。

【讨论】:

    【解决方案2】:

    这取决于您在框架的其余部分使用什么。理论上没有任何变化,因为@Service@Repository 注释基本上是@Component 注释。 @Controller@Endpoint 也可以这样说(对于 Spring Ws,还有更多)。

    但是,它们表达了类是什么(服务、存储库)的意图,并让用户清楚地知道该类属于哪个层。

    但是,如果您还使用 Spring 进行事务管理,那么 @Repository 也是该类的 adding exception translation 的触发器(另请参见 reference guide)。

    虽然没有什么可以打破它,但它可能会在某个时候打破。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 2015-06-21
      • 2021-12-31
      • 2013-03-09
      • 2012-01-13
      • 1970-01-01
      相关资源
      最近更新 更多