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

在了解Spring框架中@Repository @Component@Service @Controller@Repository @Controller@Repository批注之间的区别之前,了解@Component批注在Spring中的作用很重要。 在Spring的初始发行期间,所有bean都用于在XML文件中声明。 对于大型项目,这很快成为一项艰巨的任务,Spring团队很快就意识到了问题。 在更高版本中,它们提供基于注释的依赖项注入和基于Java的配置。 从Spring 2.5开始,引入了基于注释的依赖注入 ,该注入自动将类扫描并注册为使用@Component注释进行注释的Spring bean。 这意味着您不必使用<bean&gt ;来声明该bean。 标记并注入依赖项,它将由Spring自动完成。 使用<context:component-scan>标记启用和禁用此功能。

既然您知道了@Component批注的作用,接下来让我们看看@Service @Controller@Repository @Controller@Repository批注的作用。 在某些情况下,它们不过是@Component注释的特殊形式。 而不是在Spring MVC中的控制器类上使用@Component ,我们使用@Controllerwhich is more readable and appropriate

通过使用该批注,我们可以做两件事,首先,我们声明该类是Spring bean,并且应该由Spring ApplicationContext创建和维护,而且还要指出它是MVC设置中的控制器。 特定于Web的工具和功能使用后一种属性。

例如,DispatcherServlet将在使用@Controlle r注释但不使用@Component注释的类上查找@RequestMapping

这意味着@Component@Controller在bean创建和依赖注入方面是相同的,但后来是前者的一种特殊形式。 即使将@Controller注释替换为@Controller @Compoenent ,Spring也会自动检测并注册控制器类,但对于请求映射,它可能无法按预期工作。 您可以进一步看到,

@Service@Repository批注也是如此,它们是服务和持久层中@Component化。 应该使用@Service而不是@Component注释对服务层中的Spring Bean进行注释,而使用@Repositor y注释对持久性层中的Spring Bean进行注释。

通过使用专门的注释,我们用一块石头打了两只鸟。 首先,它们被视为Spring bean,其次,您可以放置​​该层所需的特殊行为。

例如, @Repository's不仅可以帮助基于注释的配置,还可以捕获特定于平台的异常,并将它们作为Spring统一的未经检查的异常之一重新抛出。

虽然如此,您还需要在应用程序上下文中将org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor声明为Spring bean。

这个bean后处理器将顾问程序添加到任何使用@Repository注释的bean,以便捕获任何特定于平台的异常,然后将其重新抛出为Spring的未经检查的数据访问异常之一。 您还可以在Udemy上查看Spring Framework 5:Guru入门,了解更多详细信息。

这也是Spring Interview常见问题之一,并且从Spring认证的角度来看很受欢迎。 基于这些注释及其在Spring专业认证考试中的用法,您还会发现几个问题。

Spring中的组件扫描如何工作?

从Spring 2.0开始,Spring提供了<context:component-scan>和注释驱动的依赖项注入,以自动检测并注册Spring bean,而不是在XML文件中指定它们。 但是,它仅扫描@Component ,通常不会查找@Controller@Service @Controller@Repository 。 扫描它们是因为它们本身带有@Component注释。

只需看看@Controller@Service @Controller@Repository批注定义即可:

@Component
public @interface Service {….}@Componentpublic @interface Repository {….}@Componentpublic @interface Controller {…}

因此,说@Controller@Service @Controller@Repository@Component批注的特殊类型是没有错的。 <context:component-scan>拾取它们并将其以下类注册为bean,就像它们使用@Component进行注释一样。

之所以扫描它们,是因为它们本身带有@Component注释。 如果您定义自己的自定义注释并使用@Component对其进行注释,那么还将使用<context:component-scan>

如果您想了解有关Spring中的依赖项注入,自动装配以及不同类型的配置(例如Spring中基于XML,基于注释和Java配置)的更多信息,建议您参加Pluralsight上的Spring基础知识课程 。 也可以免费试用。

摘要

这是@Service @Component@Service @Controller@Repository @Controller@Repository批注在Spring Framework中的作用的很好总结:

  1. @Component是任何Spring管理的组件或bean的通用@Component型。
  2. @Repository是持久层的@Repository型。
  3. @Service是服务层的@Service型。
  4. @Controller是表示层(spring-MVC)的@Controller型。

这是解释Spring Framework中所有这些注释的层次结构的漂亮图表:

这是所有有关的区别@Component@Controller@Service@Repository在Spring框架 。 就像我说过的那样,当启用上下文扫描时,它们全部用于自动检测Spring Bean,并且在依赖项注入方面基本上提供了相同的功能。

它们唯一的区别在于用途,即在Spring MVC中使用@Controller定义控制器,首先是Spring bean,然后是controller。 类似地, @Service Service用于注释类,这些类在Service层中保存业务逻辑,而@Repository在Data Access层中使用。

您可以在Pluralsight上的Bryna Hassen的Spring基础知识课程中了解有关组件扫描以及Spring框架如何自动检测bean的更多信息。 您也可以免费获得10天。

简而言之,您应该根据特定类所属的图层使用最合适的注释。

您可能喜欢的其他Spring Framework文章面试问题

  • Spring MVC中@RestController@Controller之间的@RestController
  • Spring MVC在内部如何工作?
  • Spring MVC中DispatcherServlet的用途是什么?
  • 如何在Java Web应用程序中启用Spring安全性?
  • Spring MVC中的@RequestParam和@PathVariable之间的区别?
  • Craig Walls的《春天在行动》
  • Eugen Paraschiv的Spring Master Class REST

感谢您到目前为止阅读本文。 如果您喜欢这篇文章,请与您的朋友和同事分享。 如果您有任何问题或反馈,请留言。

翻译自: https://www.javacodegeeks.com/2017/11/difference-component-service-controller-repository-spring.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信号与系统 chapter13 阶跃响应的定义与求法

定义 阶跃响应是阶跃函数ξ(t)\xi(t)ξ(t)所引起的***零状态响应&#xff0c;***记为g(t)g(t)g(t) 这玩意的求法与咱们前面画信号与系统框图那一部分有异曲同工之妙信号与系统chapter8 有两种方法 经典法 利用单位阶跃函数与单位冲激响应之间的关系 看一道例题&#xff1a…

语音识别插件_2D动画唇动合成,根据语音自动生成动画人物口型

蕾师师 发自 凹非寺量子位 报道 | 公众号 QbitAI只需要输入一段语音&#xff0c;代码会自动生成与之相对的动画唇形。还是毫无违和感的那种。这是一个在GitHub上拥有501星的开源项目&#xff0c;叫做Rhubarb Lip Sync。它既可以是Windows和OS X命令行工具&#xff0c;也可以作为…

安装指定版本pytorch_Ubuntu16.04安装pytorch(七)

Ubuntu16.04自带python 2.7.12 和python 3.5.2&#xff0c;不需要自己装python第一步&#xff1a;安装pip3sudo apt-get install python3-pip顺便安装numpypip3 install numpy第二步&#xff1a;配置pip使用的镜像源---------------------------------------------------------…

后怎么恢复_爬山后小腿肌肉酸痛怎么办 ?这样来恢复!|新生活公社

爬山后小腿肌肉酸痛怎么办 &#xff1f;这样来恢复&#xff01;在爬山之后腿疼的话可以用热敷、按摩、泡脚、拉伸等等方法来帮助自己恢复&#xff0c;爬山之后腿疼是正常的现象&#xff0c;我们在爬山之后要及时拉伸。爬山后小腿肌肉酸痛怎么办1热敷这是很有效的又简单的方法&a…

java实现次方的运算_Java中对于位运算的优化以及运用与思考

引言随着JDK的发展以及JIT的不断优化&#xff0c;我们很多时候都可以写读起来易读但是看上去性能不高的代码了&#xff0c;编译器会帮我们优化代码。之前大学里面学单片机的时候&#xff0c;由于内存以及处理器性能都极其有限(可能很多时候考虑内存的限制优先于处理器)&#xf…

dep指定版本 go_Go 1.12 版本的新特性

Go 1.12昨天&#xff0c;Go 官方发布 1.12 版本。本文介绍下 Go 1.12 版本变更的内容。Go 1.12 正式版发布了&#xff0c;距离上个正式发布版 Go 1.11 已经过去半年。跟往常一样&#xff0c;Go 1.12 保持了 兼容性承诺&#xff0c;预期所有 Go 程序会像之前一样正常编译。新版本…

信号与系统 chapter14 卷积积分的应用

卷积的时移特性 若有一个卷积&#xff1a; f(t)f1(t)∗f2(t)f(t)f_1(t)*f_2(t)f(t)f1​(t)∗f2​(t)&#xff0c;卷积右边的函数都发生了时移&#xff0c;分别为t1,t2t_1,t_2t1​,t2​&#xff0c;则有&#xff1a; 不要管怎么来&#xff0c;记下就完事了 例题&#xff1a; …

java null转换jason_Java笔记Java常量、变量

“要成为绝世高手&#xff0c;并非一朝一夕&#xff0c;除非是天生武学奇才&#xff0c;但是这种人…万中无一”——包租婆这道理放在Java语言学习上也一并受用。在编程方面有着天赋异禀的人毕竟是少数&#xff0c;我们大多数人想要从java语言小白进阶到高手&#xff0c;需要经…

通信系统中的多普勒频移

多普勒现象在通信系统中的表现 当终端在运动特别是在高速运动时&#xff0c;移动终端和基站接收端的信号频率会发生变化&#xff0c;其计算公式如下图所示&#xff1a; fdfc∗v∗cosθf_d\frac{f}{c}*v*cos\thetafd​cf​∗v∗cosθ θ\thetaθ为移动台移动方向与入射方向的夹…

mockito_Mockito – JAXB的RETURNS_DEEP_STUBS

mockito很抱歉没有写一段时间&#xff0c;但是我正忙于为DZone编写JBoss Drools Refcard&#xff0c;而且我正在写一本有关Mockito的书&#xff0c;因此我没有太多时间来写博客了…… 无论如何&#xff0c;最近在我当前的项目中&#xff0c;我对使用Mockito和JAXB结构进行单元…

常见扩频序列

扩频通信就要借助扩频序列 对扩频序列的要求如下&#xff1a; 具有尖锐的自相关特性有尽可能小的互相关特性&#xff0c;最好为0序列平衡&#xff0c;0与1的数量尽可能一样多在扩频序列族中有数目足够多的序列可供选用有尽可能大的序列复杂度 常见的几种扩频序列 PN序列 第一…

删除文件夹下所有的文件_VB删除文件和文件夹的方法

在VB编程中&#xff0c;我们如何删除一个指定的文件&#xff0c;或者文件夹呢&#xff1f;本文&#xff0c;介绍两种方法&#xff0c;详细的介绍如何实现删除文件和文件夹&#xff0c;并对两种方法的区别做一个说明。一、删除文件的方法方法1&#xff1a;使用kill方法删除文件语…

无线网络设计基础

移动电波的传播特点 受到地形影响因素大存在严重的多径衰落迹象存在固定通信中没有的阴影衰落存在相对运动引起的多普勒效应存在由时延散布引起的信号波形展宽 无线收发信设备、天馈线系统、无线电信道组成无线通信系统 自由空间传输损耗 理想条件下&#xff1a; Lbs32.4520…

GSM网络与CDMA网络话务量、基站容量相关计算

GSM网络与CDMA网络的区别 网络类型GSMCDMA编码方式频分多址和时分多址相结合方式码分多址覆盖面积较小较大容量小大话音质量较低支持软切换&#xff0c;和较软切换&#xff0c;使得用户在基站边缘通话时信号更加稳定 GSM规范中推荐使用的频道配置规范 GSM的频道配置 每个小区…

参数整定临界比例度实验_PID理解起来很难?系统讲解PID控制及参数调节,理论加实际才好!...

在实际工程中&#xff0c;应用最为广泛的调节器控制规律为比例、积分、微分控制&#xff0c;简称PID控制&#xff0c;又称PID调节。PID控制器问世至今以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。PID调节控制是一个传统控制方法&#xff0c;它适…

apache jmeter_Apache Server和JMeter调试

apache jmeter我一直在使用JMeter为生产服务器生成负载以测试我的应用程序。 该测试计划具有13个以上的HTTP采样器以发出不同的请求&#xff0c;并具有一个正则表达式提取器以从响应中提取一些值。 此值在连续的HTTP Sampler中使用。 这个测试用例简单而直接。 最初&#xff0c…

4计算准确率_孩子计算总出错?4个好方法帮助低年级学生提高计算准确率!

低年级孩子&#xff0c;由于活泼好动&#xff0c;注意力不容易集中&#xff0c;思维容易被分散。表现在学业上&#xff0c;就会出现学习水平参差不齐的情况。而最主要的表现&#xff0c;就是计算能力的差异。据资深数学老师观察&#xff1a;成绩好的孩子&#xff0c;一般不只掌…

使用Speedion 3.0.17或更高版本轻松从事务中返回值

交易次数 在我以前的文章中&#xff0c;我写了关于如何使用Speedment轻松使用事务的方法&#xff0c;其中我们原子地更新了两个银行帐户。 众所周知&#xff0c;事务是一种将多个数据库操作组合到一个原子执行的单个操作中的方法。 但是事务不仅与更新数据库有关&#xff0c;而…

双代号网络图节点时间参数_管理和实务都考!快速学会单代号与双代号参数计算...

工程网络计划是二级建造师《建设工程施工管理》科目每年均会进行考核的高频考点&#xff0c;重点在双代号、单代号网络计划的概念及应用。主要题型为通过网络图或文字描述计算相关网络参数或确定关键线路&#xff0c;本篇就双代号、单代号网络计划相关参数的计算&#xff0c;以…

idea中maven执行install报错_IntelliJ IDEA Maven编译install时报错,无效的发行版:1.8

1.首先看java环境是否配置正确JAVA_HOME : C:\Program Files\Java\jdk1.8.0_92 //安装的Jdk路径PATH: %JAVA_HOME%\bin;按下"window"R 输入cmd 按下"ENTER" 输入java -version&#xff0c;如果出现了版本号等信息说明配置成功2.确认maven配…