一文了解Spring中Component、Service、Controller和Repository之间的区别

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

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

如今已经知道了@Component注释的做用,让咱们看看@Service、@Controller和@Repository注释的做用。面试

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

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

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

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


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

经过使用专门的注释,咱们能够一箭双雕。首先,它们被视为Spring bean,其次,能够放置​​该层所需的特殊行为。学习

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

为此,还须要将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注释定义:


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

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


摘要
下面是对@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用于数据访问层。

相关文章
相关标签/搜索