Spring注解@Repository和@Service

使用@Repository和@Service有什么好处?

不要告诉我有关组件扫描等,我期待着一些额外的好处或function,如果有的话。

如果我不使用它会怎么样? 我会错过什么?

有几个原因:

  1. 使用更具体的注释来定位切入点更容易。 不要低估这个的用处!
  2. @Repository注解带有一些额外的function:它导致exception被包装为DataAccessException
  3. @Service注释可能会在未来获得额外的语义,但还没有发生。

@Repository注解(在Spring 2.0中引入)和@Service注解(在Spring 2.5中引入)是@Component注解的特化。

使用@Repository@Service over @Component的主要优点是,编写一个AOP切入点是很容易的,例如,所有的切入点都是以@Repository注解的。

此外,专门的注释有助于清楚地划分应用程序层(在标准的3层应用程序中)。

我相信Spring在添加这些Component注释时有两件事情。

  1. 它们可以用来指定用该子组件注释的所有对象的切点。 (所有@Repository或所有@Service切入点)
  2. 我认为Spring也提到他们会为他们添加一些未来的function。 (我没有为此引用,我只是觉得我读了这个地方)

如果你使用TDD ,仔细devise(当然是testing)@Services将是有用的,因为它们将有利于完全注入你所定义的所有@Autowired组件。

例如,你可以直接将你的function实现到一个@Controller中,但是在这种情况下,testing会比较困难,而且你需要定义所有的模拟元素(在springframework 3.1中比较容易,但是仍然是“糟糕的devise”)。

从数据库连接的angular度来看,使用@Repository@Service注释是非常重要的。

对所有Web服务types的数据库连接使用@Service对所有存储的proc数据库连接使用@Repository如果不使用正确的注释,则可能会遇到由回滚事务覆盖的提交exception。 您将在压力负载testing中看到与回滚JDBC事务相关的exception。

Spring中@Repository构造型的好处

  1. @Repository也是一个@Component,因此你可以使用组件扫描来自动检测你的@Repository注释bean,并将它们注册到ApplicationContext中。

  2. 将获得自动exception转换不仅仅是日志logging。

  3. 所有持久性exception的exception都被转换为一致的Spring DataAccessException层次结构,因此,只需处理1种exception,即使使用多个策略(通常将hibernate / jpa与纯jdbc混合使用)

  4. 无需configuration。