java - @Component, @Repository 和 @Service之间的区别是什么?

  显示原文与译文双语对照的内容

@Component@Repository & @Service 注释可以在 spring 中互换使用,还是它们提供了任何特殊功能,除了作为一个符号设备?

换句话说,如果我有一个服务类,并且我将注释从 @Service 更改为 @Component,它的行为仍然是一样的?

或者注释也影响类的行为和功能?

时间:

spring 文档列表中:

在 spring 2.0和更高版本中,@Repository 注释是任何类的标记,用于满足存储库的角色或者构造型( 也称为数据访问对象或者 DAO ) 。 标记的用法是自动翻译异常。

spring 2.5引入了进一步的构造型注释: @Component, @Service, 和 @Controller. @Component 是任何Spring-managed组件的通用构造型。 @Repository, @Service, 和 @Controller 是针对更具体的用例的@Component的专门化,例如在持久性,服务和表示层中。

因此,你可以使用 @Component, 注释你的组件类,但通过使用 @Repository, @Service, 或者 @Controller 注释它们,你的类更适合于通过工具进行处理或者与方面关联。 例如这些构造型注解成为切入点的理想目标。

因此,如果你在使用 @Component 或者 @Service 为你的服务层进行选择,@Service 显然是更好的选择。 类似地,如上所述,@Repository 已经被支持作为持久性层中自动异常转换的标记。


| Annotation | Meaning |
+------------+-----------------------------------------------------+
| @Component | generic stereotype for any Spring-managed component |
| @Repository| stereotype for persistence layer |
| @Service | stereotype for service layer |
| @Controller| stereotype for presentation layer (spring-mvc) |

它们几乎是相同的- 所有它们都意味着这个类是一个 spring bean 。 @Service@Repository@Controller 是专门的@Component 。 你可以选择对它们执行特定操作。 例如:

  • @Controller bean被spring-mvc使用
  • @Repository bean适用于持久性异常转换

另一件事是你将组件的语义指定给不同的层。

@Component 提供的一个东西是,你可以用它注释其他注释,然后使用与 @Service 相同的方式。

例如最近我做了:


@Component
@Scope("prototype")
public @interface ScheduledJob {..}

所以所有用 @ScheduledJob 注释的类都是 spring bean,除了被注册为quartz作业之外。 你只需提供处理特定注释的代码。

@Component 等同于

 
<bean>

 

@Service, @Controller,@Repository = {@Component + 一些特殊的functionality}

也就是说,服务,控制器和仓库在功能上是相同的。

三个注释是用于分离 "图层"在你的应用程序.

  • 控制器就像分派,转发,调用服务方法等。
  • 服务包含业务逻辑,计算等。
  • 知识库是他们直接访问数据库的DAOs(Data Access Objects), 。

现在你可能会问为什么分离它们:( 我假设你知道AOP-Aspect的编程)

假设你只想监视DAO层的活动。 你将编写一个 Aspect(A class) 类做一些记录之前和之后的每一个方法调用你的刀,你能够使用aop作为你有三个不同的层次和混合。

所以你可以记录 DAO"环绕","先于"或者"之后"方法。 你可以这样做,因为你在第一个地方有一个 DAO 。 你刚刚实现的是对关注点或者任务的分

想象一下如果只有一个注释 @Controller,,那么这个组件就会有分派,业务逻辑和访问数据库的所有混合,这样肮脏的代码 !

上面提到的是一个非常常见的场景,还有很多使用三个注解的用例。

spring 2.5引入了进一步的构造型注释: @Component, @Service 和 @Controller. @Component 充当任何Spring-managed组件的通用 Prototype ;而 @Repository, @Service, 和 @Controller 作为 @Component的特例,用于更具体的用例。 这意味着你可以用 @Component, 注释你的组件类,但通过使用 @Repository, @Service, 或者 @Controller 注释它们,你的类更适合使用工具或者与方面关联。 例如这些构造型注解成为切入点的理想目标。 当然,@Repository, @Service, 和 @Controller 也可能在 Spring Framework 未来版本中携带额外的语义。 因此,如果你在使用 @Component 或者 @Service 作为你的服务层的决策,@Service 显然是更好的选择。 类似地,如上所述,@Repository 已经被支持作为持久性层中自动异常转换的标记。


@Component – Indicates a auto scan component.
@Repository – Indicates DAO component in the persistence layer.
@Service – Indicates a Service component in the business layer.
@Controller – Indicates a controller component in the presentation layer.

引用:- http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s12.html

使用 @Service@Repository 注释对于数据库连接透视图非常重要。

  1. 为所有的web服务类型使用 @Service 连接
  2. 对所有存储的过程数据库连接使用 @Repository

如果不使用适当的注释,你可能会面临由回滚事务覆盖的提交异常。 在压力负载测试期间,你会看到与回滚JDBC事务相关的异常。

在 spring @Component@Service@Controller 中。 @Component 是用于以下用途的构造型注解:

@Controller:请求映射和表示页面做 换句话说,表示不会去任何其他文件直接到 @Controller 类和检查请求的路径 @RequestMapping 注释写在方法调用之前如果必要的。

@Service: 所有业务逻辑都在这里 换句话说,数据相关的计算和 all.This 注释,我们的用户不直接调用持久化方法,因此它使用这个注释调用这个方法。 请求 @Repository 为每个用户请求

@Repository: 这是应用程序的数据访问层,用于从数据库获取数据。 换句话说,将所有相关的数据库操作都由仓库完成。

@Component - 用组件构造型注释其他组件的( 例如REST资源类) 。

@Repository@Service@Controller 作为专业化的@Component 更具体的使用在此基础上你可以取代 @Service @Component 但在这种情况下,你松散的专业化。


1. **@Repository** - Automatic exception translation in your persistence layer.
2. **@Service** - It indicates that the annotated class is providing a business service to other layers within the application.

在多层应用程序中,我们将不同层表示,服务,业务,数据访问 等等 当一个类被 spring 为auto-detection注释,那么我们应该使用各自的原型如下。

  • @Component - 通用并且可以跨应用程序使用。
  • @Service - 在服务层级别注释类。
  • @Controller - 在表示层上注释类,主要用于 spring MVC 。
  • @Repository - 在持久层注释类,它将充当数据库存储库。

@Component - 表示自动扫描组件。
@Repository - 表示持久层中的DAO组件。
@Service - 表示业务层中的服务组件。
@Controller - 表示表示层中的控制器组件。

你会注意到所有的@Repository,@Service 或者 @Controller 都有 @Component. 注释 那么,我们可以只使用 @Component 对自动扫描的所有组件? 是的,而且 spring 会自动扫描你的所有组件,并用 @Component 注释。

它工作正常,但不是一个好的做法,可读性,你应该总是声明 @Repository,@Service 或者 @Controller 指定层使代码更易于阅读。

即使我们交换 @Component 或者 @Repository 或者 @service

它的行为是一样的,但是一方面,如果我们使用组件或者 @ 服务,就不能捕捉到与DAO相关的某些特定异常

...