在了解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

Spring中@ Component,@ Service,@ Controller和@Repository之间的区别相关推荐

  1. r中rep_Spring中@ Component,@ Service,@ Controller和@Repository之间的区别

    r中rep 在了解Spring框架中@Repository @Component , @Service @Controller , @Repository @Controller和@Repositor ...

  2. Spring中Model、ModelMap及ModelAndView之间的区别

    1. Model(org.springframework.ui.Model) Model是一个接口,包含addAttribute方法,其实现类是ExtendedModelMap. ExtendedMo ...

  3. Spring中@component的使用

    Spring中@component的使用 @component是spring中的一个注解,它的作用就是实现bean的注入,在探究@component前先了解一下注解?何为注解?注解本质上就是一个类,开 ...

  4. IO多路复用中select、poll、epoll之间的区别

    本文来说下IO多路复用中select.poll.epoll之间的区别 文章目录 什么是IO多路复用 为什么有IO多路复用机制 同步阻塞(BIO) 同步非阻塞(NIO) IO多路复用(现在的做法) 3种 ...

  5. SQL Server中唯一索引和唯一约束之间的区别

    This article gives you an overview of Unique Constraints in SQL and also the Unique SQL Server index ...

  6. 解析java中方法的重载和重写之间的区别与联系

    解析java中方法的重载和重写之间的区别与联系 1 不同点 1.1 方法重写是在不同的类中(父子类),方法重载是在同一类中 1.2 方法重载最初的目的是构造方法的多样化,方法重写的目的是让重写的方法满 ...

  7. Spring中如Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?

     作者:zoe_java cnblogs.com/zoe-java/p/11530888.html 方法一: Controller中注入service的时候使用@Autowired自动注入,@Qual ...

  8. Spring中同一个service中方法相互调用事务不生效问题解决方案

    问题描述: 我们在用Spring框架开发Web项目过程中,经常需要用同一个service中的一个方法调用另一个方法,如果此时调用方没有添加事务注解@Transactional,而在被调用方添加事务注解 ...

  9. Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系

    在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...

最新文章

  1. Ansible02-实施playbook
  2. 微信小游戏开发教程-游戏实现2
  3. linux grub修复 手动引导进入系统
  4. 宝塔同时安装苹果cms海洋cms_★苹果cms常见问题有哪些?100个常见问题的解决方法...
  5. javaweb学习总结(十)——HttpServletRequest对象(一)
  6. java的自动装配是什么意思_java – 什么时候在Spring中使用自动装配
  7. Codeforces Round #350 (Div. 2) B. Game of Robots 水题
  8. 安卓应用安全指南 5.4.1 通过 HTTPS 的通信 示例代码
  9. [Ubuntu16.04]Anaconda下运行jupyter notebook出现Running as root is not recommended.
  10. 初探Nacos(四)-- SpringBoot下使用Nacos作为配置中心
  11. 测试的目的_盐雾测试的目的是什么
  12. log4j.xml按照日期生成_荐读 | 进项发票快速生成凭证!这个功能太方便了!
  13. 神州数码云平台网络环境
  14. bluez5.50+pulseaudio实现蓝牙音响音频播放
  15. 真牛皮!wsl安装位置
  16. 按着Phoenix Framework文档练个手,感受一下Elixir语言。
  17. JavaScript弹出框、对话框、提示框、弹窗总结
  18. 一年外包经验入职字节啦
  19. 计算机数学英语考本的分数线,专接本考试数学英语的成绩没有过公共线还有没有被..._公共英语考试_帮考网...
  20. Java:一般数据结构

热门文章

  1. Dubbo(四)之xml配置方式
  2. 在JavaFX程序中嵌入Swing内容
  3. Spring MVC表单防重复提交
  4. Intellij Idea乱码解决方案都在这里了
  5. 班级日常 | 一天一瞬间!
  6. java中随机生成26个字母组合的随机验证码
  7. 教你一招快速打开idea的秘诀
  8. 2018蓝桥杯省赛---java---B---7(螺旋折线)
  9. stream进行分组统计
  10. Python MySQL 插入表