Spring中Component、Service、Controller和Repository之间的区别

在学习Spring框架中的@Component、@Service、@Controller和@Repository注释之间的区别之前,了解@Component注释在Spring中的作用是很重要的。在Spring的初始版本中,所有bean都使用XML文件声明。这对于一个大项目而言就会变成一个艰巨的任务,Spring人员很快就意识到这个问题。在之后的版本中,他们提供了基于注解的依赖注入和基于java的配置。从Spring 2.5开始引入了基于注释的依赖注入,它自动扫描并注册类作为使用注释的Spring bean@Component注释。

这意味着不使用 标记该声明bean 并注入依赖项,它将由Spring自动完成。使用<context:component-scan>标记启用和禁用此功能。

现在已经知道了@Component注释的作用,让我们看看@Service、@Controller和@Repository注释的作用。

它们只是特定情况下@Component注释的特殊形式。我们没有在Spring MVC的控制器类上使用@Component,而是使用@Controller,这样可读性更好,也更合适。

通过使用该注释,我们做了两件事,首先我们声明这个类是一个Spring bean,应该由Spring ApplicationContext创建和维护,但我们也指出它是MVC设置中的控制器。后一个属性被特定于web的工具和功能所使用。

例如,DispatcherServlet将在使用@Controller而不是@Component注释的类上寻找@RequestMapping。

这意味着@Component和@Controller在bean创建和依赖注入方面是相同的,但后者是前者的一种特殊形式。如果将@Controller注释替换为@Compoenent, Spring也可以自动检测并注册控制器类,但它在请求映射方面可能无法正常工作。

Spring中Component、Service、Controller和Repository之间的区别
@Service和@Repository注释也是如此。它们是服务和持久层中@Component的特化。服务层中的Spring bean应使用@Service而不是@Component进行注释,且持久层中的spring bean应使用@Repository进行注释。

通过使用专门的注释,我们可以一举两得。首先,它们被视为Spring bean,其次,可以放置​​该层所需的特殊行为。

例如,@Repository不仅在基于注释的配置中提供了帮助,而且还捕获了平台特定的异常,并将其作为Spring统一的未检查异常重新抛出。

为此,还需要将org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor声明为Spring bean。

这个bean post处理器将一个advisor添加到带有@Repository注解的任何bean中,以便捕获平台特定的异常,然后作为Spring未检查的数据访问异常重新抛出。

这也是Spring面试中常见的问题之一,也是Spring认证的一个流行概念。

Component Scanning如何在Spring中运行?
从Spring 2.0开始,Spring提供了 <context:component-scan> 和注释驱动,来自动检测和注册Spring bean,而不是在XML文件中指定它们。

但是,它只扫描@Component并且一般不会查找@ Controller,@ Service和@Repository。它们被扫描,因为它们本身是用@Component注释的。

只需看看@ Controller,@ Service和@Repository注释定义:

@Component 
public @interface Service { 
.... 
} @Component public @interface Repository { ... }


@Component 
public @interface Controller{ 
... 
}

因此,说@Controller、@Service和@Repository是特殊类型的@Component注释并没有错。context:component-scan>将它们收集起来,并将它们下面的类注册为bean,就像用@Component注释它们一样。

扫描它们,是因为它们本身都使用@Component注释进行注释。如果你定义自己的自定义注释并使用@Component注释它,那么它也将使用 <context:component-scan>进行扫描。

Spring中Component、Service、Controller和Repository之间的区别
摘要
下面是对@Component、@Service、@Controller和@Repository注释在Spring框架中的作用做的总结:

@Component是任何spring管理的组件或bean的通用构造型。

@Repository是持久层的构造型。

@Service是服务层的构造型。

Controller是表示层(spring-MVC)的构造型。

下图很好的解释Spring Framework中所有这些注释的层次结构:

Spring中Component、Service、Controller和Repository之间的区别
这就是Spring框架中@Component、@Controller、@Service和@Repository之间的区别。正如我所说,当启用上下文扫描时,它们都用于自动检测Spring bean,并且在依赖项注入方面提供了基本相同的功能。且本质上提供了与依赖注入相同的功能。

它们唯一的不同之处在于它们的用途,即在Spring MVC中使用@Controller来定义controller,首先是Spring bean,然后是controller。同样,@Service用于在服务层中保存业务逻辑的注释类,而@Repository用于数据访问层。

整套架构面试题及系统化的架构师资料,热爱技术,喜欢程序员这一职业,有理想成为一名架构师,想面试跳槽涨薪,想提升自己的技术水平欢迎加入Java进阶架构交流:加入142019080。

直接点击链接加群。https://jq.qq.com/?_wv=1027&k=5lXBNZ7

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值