欢迎大家来到IT世界,在知识的湖畔探索吧!
在学习Spring框架中的@Component、@Service、@Controller和@Repository注释之间的区别之前,了解@Component注释在Spring中的作用是很重要的。在Spring的初始版本中,所有bean都使用XML文件声明。这对于一个大项目而言就会变成一个艰巨的任务,Spring人员很快就意识到这个问题。在之后的版本中,他们提供了基于注解的依赖注入和基于java的配置。从Spring 2.5开始引入了基于注释的依赖注入,它自动扫描并注册类作为使用注释的Spring bean@Component注释。
这意味着不使用<bean> 标记该声明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也可以自动检测并注册控制器类,但它在请求映射方面可能无法正常工作。
@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{ ... }
欢迎大家来到IT世界,在知识的湖畔探索吧!
因此,说@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、@Controller、@Service和@Repository之间的区别。正如我所说,当启用上下文扫描时,它们都用于自动检测Spring bean,并且在依赖项注入方面提供了基本相同的功能。且本质上提供了与依赖注入相同的功能。
它们唯一的不同之处在于它们的用途,即在Spring MVC中使用@Controller来定义controller,首先是Spring bean,然后是controller。同样,@Service用于在服务层中保存业务逻辑的注释类,而@Repository用于数据访问层。
回复【架构】可获得最新学习面试、架构资料!!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/35841.html