Spring 中的@Component、@Repository 和@Service 注解有什么区别?

@Repository注释是满足存储库(也称为数据访问对象或 DAO)角色或原型的任何类的标记。此标记的用途之一是异常的自动翻译,如Exception Translation中所述。

Spring 提供了更多的原型注解:@Component、@Service和@Controller. @Component是任何 Spring 管理的组件的通用构造型。@Repository, @Service, 和@Controller是@Component针对更具体用例(分别在持久层、服务层和表示层)的特化。因此,您可以使用 注释组件类@Component,但是通过使用 、 注释它们@Repository,@Service或者@Controller 相反,您的类更适合工具处理或与方面关联。

例如,这些原型注释是切入点的理想目标。@Repository, @Service, 并且 @Controller还可以在 Spring 框架的未来版本中携带额外的语义。因此,如果您在使用 @Component或@Service用于您的服务层之间进行选择,@Service显然是更好的选择。同样,如前所述,@Repository已经支持作为持久层中自动异常转换的标记。

注解意义
@Component任何 Spring 管理的组件的通用构造型
@Repository持久层的原型
@Service服务层的构造型
@Controller表示层的构造型(spring-mvc)

首先是相似度

值得再次强调的第一点是,对于 BeanDefinition 的扫描自动检测和依赖注入,所有这些注释(即,@Component、@Service、@Repository、@Controller)都是相同的。我们可以用一个代替另一个,并且仍然可以解决问题。

@Component
这是一个通用的原型注解,表明该类是一个spring组件。
@Component 的特别之处在于
context:component-scan只扫描@Component而不寻找@Controller,@Service和@Repository一般情况下。它们被扫描是因为它们本身带有注释@Component。

因此,说@Controller,@Service和@Repository是特殊类型的@Component注解并没有错。context:component-scan拾取它们并将它们的以下类注册为 bean,就像它们被注释一样@Component。

特殊类型的注解也会被扫描,因为它们本身是带有@Component注解的,也就是说它们也是@Components。如果我们定义自己的自定义注解并使用 进行注解@Component,它也会被扫描context:component-scan

@Repository

这是为了表明该类定义了一个数据存储库。

@Repository 有什么特别之处?

除了指出这是一个基于 Annotation 的 Configuration之外,它@Repository的工作是捕获特定于平台的异常并将它们作为 Spring 的统一未检查异常之一重新抛出。为此,我们提供了PersistenceExceptionTranslationPostProcessor,我们需要将其添加到 Spring 的应用程序上下文中,如下所示:

这个 bean 后处理器向任何带有注释的 bean 添加了一个顾问,@Repository以便捕获任何特定于平台的异常,然后作为 Spring 的未经检查的数据访问异常之一重新抛出。

@Controller注释表明一个特定的类充当控制器的角色。@Controller注释充当被注释类的构造型,指示其角色。

@Controller 有什么特别之处?

我们不能用任何其他的类似@Serviceor来切换这个注解@Repository,即使它们看起来一样。调度程序扫描带有注释的类@Controller并检测其中带有@RequestMapping注释的方法。我们只能使用@RequestMappingon/in 那些类被注释的方法,@Controller并且它不能与@Component,@Service等一起使用@Repository…

注意:如果一个类已经通过任何替代方法注册为 bean,例如 through@Bean或 through@Component等@Service…注解,则@RequestMapping如果该类也使用注解进行注解,则可以选择该类@RequestMapping。但这是一个不同的场景。

@Service
bean 在存储库层中保存业务逻辑和调用方法。

@Service 有什么特别之处?

除了它用于指示它持有业务逻辑这一事实之外,此注释中没有其他值得注意的地方;但谁知道呢,Spring 将来可能会添加一些额外的异常。

还有什么?

与上面类似@Service,未来 Spring 可能会基于它们的分层约定添加特殊功能。因此,尊重约定并根据层使用它始终是一个好主意。@Controller@Repository

转自 https://stackoverflow.com/questions/6827752/whats-the-difference-between-component-repository-service-annotations-in

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值