Spring中的@ Component,@ Repository和@Service批注有什么区别?

@Repository @Component@Repository@Service批注可以在Spring中互换使用吗,或者除了充当注解设备外,它们还提供任何特定功能吗?

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

还是注释也会影响类的行为和功能?


#1楼

使用@Service@Repository注解是从数据库连接的角度很重要。

  1. @Service用于所有Web服务类型的数据库连接
  2. 对所有存储的proc DB连接使用@Repository

如果未使用正确的注释,则可能会遇到由回滚事务覆盖的提交异常。 在压力负载测试期间,您将看到与回滚JDBC事务相关的异常。


#2楼

Spring 2.5引入了更多的构造型注释:@ Component,@ Service和@Controller。 @Component用作任何Spring托管组件的通用构造型; 而@ Repository,@ Service和@Controller作为@Component的特殊化,用于更具体的用例(例如,分别在持久性,服务和表示层中)。 这意味着您可以使用@Component来注释组件类,但是通过使用@ Repository,@ Service或@Controller来注释它们,您的类更适合于通过工具进行处理或与方面相关联。 例如,这些构造型注释成为切入点的理想目标。 当然,@ Repository,@ Service和@Controller也有可能在Spring框架的未来版本中带有其他语义。 因此,如果您决定在服务层使用@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. 

参考: -Spring文档-使用Java进行类路径扫描,托管组件和编写配置


#3楼

即使我们互换@Component或@Repository或@service

它将具有相同的行为,但是一方面是,如果我们使用component或@ service,它们将无法捕获与DAO而不是存储库相关的某些特定异常。


#4楼

在Spring中, @Service @Component@Service @Controller@Repository @Controller@Repository@Repository型注释,用于:

@Controller: 从表示页面完成的请求 映射即表示层不会转到任何其他文件,它将直接转到@Controller类并检查@RequestMapping注释中的请求路径,该注释在必要时在方法调用之前编写。

@Service :所有业务逻辑都在这里,即与数据相关的计算和所有。业务层的此批注,我们的用户没有直接调用持久性方法,因此它将使用此批注来调用此方法。 它将根据用户请求请求@Repository

@Repository :这是应用程序的持久层(数据访问层),用于从数据库中获取数据。 即所有与数据库有关的操作都由存储库完成。

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

指示带注释的类是“ 组件 ”。 当使用基于注释的配置和类路径扫描时,此类会被视为自动检测的候选。

其他类级注释也可以被视为标识组件,通常是一种特殊的组件:例如@Repository注释或AspectJ的@Aspect注释。

在此处输入图片说明


#5楼

@Component等效于

<bean>

@ Service,@ Controller,@ Repository = {@Component +一些其他特殊功能}

这意味着服务,控制器和存储库在功能上是相同的。

这三个注释用于在应用程序中分隔“层”

  • 控制器只是执行诸如调度,转发,调用服务方法之类的工作。
  • 服务保留业务逻辑,计算等
  • 存储库是DAO(数据访问对象),它们直接访问数据库。

现在您可能会问为什么将它们分开:(我假设您知道面向AOP的面向程序设计)

假设您只想监视DAO层的活动。 您将编写一个Aspect(A类)类,该类在调用DAO的每个方法之前和之后进行一些日志记录,因为您具有三个不同的层并且没有混合在一起,所以可以使用AOP进行记录。

因此,您可以在DAO方法“前后”,“之前”或“之后”记录DAO。 之所以可以这样做,是因为您首先拥有了一个DAO。 您刚刚实现的是关注点或任务分离。

想象一下,如果只有一个@Controller注释,那么此组件将具有调度,业务逻辑和访问数据库的所有混合功能,因此代码很脏!

上面提到的是一种非常常见的场景,为什么要使用三个注释还有更多的用例。


#6楼

@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.

#7楼

所有这些注释都是立体类型的注释类型,这三个注释之间的区别是

  • 如果我们添加@Component,则它告诉类的角色是组件类,这意味着它是由某种逻辑组成的类,但是它不能告诉类是否包含
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值