SpringMVC的执行流程

SpringMVC的执行流程

在这里插入图片描述

  1. 用户点击某个请求路径,发起一个request请求,此请求会被前端控制器处理。
  2. 前端控制器请求处理器映射器去查找Handler。可以是基于注解的、基于XML配置的或者基于Java配置的。
  3. 处理器映射器根据配置找到相应的Handler(可能包含若干个Interceptor拦截器),返回给前端控制器。
  4. 前端控制器请求处理器适配器去执行相应的Handler处理器(常称为Controller)。
  5. 处理器适配器执行Handler处理器。
  6. Handler处理器执行完毕之后会返回给处理器适配器一个ModelAndView对象(SpringMVC底层对象,包括Model数据模型和View视图信息)。
  7. 处理器适配器接收到Handler处理器返回的ModelAndView后,将其返回给前端控制器。
  8. 前端控制器接收到ModelAndView后,会请求视图解析器(ViewResolver)对视图进行解析。
  9. 视图解析器根据View信息匹配到相应的视图结果,反馈给前端控制器。
  10. 前端控制器收到View具体视图后,进行视图渲染,将Model中的模型数据填充到View视图中的request域,生成最终的视图(View)。
    前端控制器向用户返回请求结果。
处理器映射器根据配置找到相应的Handler(可能包含若干个Interceptor拦截器),返回给前端控制器

在Spring MVC中,处理器映射器(HandlerMapping)负责根据HTTP请求找到相应的处理器(Handler)。处理器通常是一个控制器方法。处理器映射器通过不同的策略来查找处理器,这些策略可以是基于注解的、基于XML配置的或者基于Java配置的。

以下是一些常见的根据什么查找处理器的例子:

  1. 基于注解的映射

    • @RequestMapping:这是最常用的注解,可以直接标注在控制器类或方法上。例如,如果一个控制器方法被标注为@RequestMapping("/hello"),那么当接收到路径为/hello的请求时,这个方法就会被调用。
    • @GetMapping@PostMapping等:这些是@RequestMapping的特定类型,用于处理特定HTTP方法的请求。
  2. 基于XML配置的映射

    • 在Spring的XML配置文件中,可以使用<bean>元素定义一个处理器映射,并通过<property>元素设置其属性,如handler-mappinginterceptors
    • 使用SimpleUrlHandlerMappingBeanNameUrlHandlerMapping等具体的处理器映射实现类来配置URL到处理器的映射关系。
  3. 基于Java配置的映射

    • 在Java配置类中,可以使用@EnableWebMvc注解启用Spring MVC的自动配置功能,然后通过@Configuration@Bean注解定义处理器映射。
    • 使用RequestMappingHandlerMapping作为处理器映射的实现类,并配置其属性。

无论使用哪种方式,处理器映射器都会根据请求的URL和HTTP方法找到对应的处理器。如果有多个拦截器(Interceptor)配置在处理器上,它们将在处理器执行前后按照配置的顺序被调用。

最终,前端控制器(DispatcherServlet)会接收到处理器映射器返回的处理器(可能包含若干个拦截器),然后继续后续的请求处理流程。

Spring 事务传播行为

Spring 事务传播行为定义了当一个事务方法被另一个事务方法调用时,应该如何处理事务。以下是 Spring 事务传播行为的详细介绍及各自举例说明:

  1. REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是最常见的传播行为,适用于大多数业务方法。

    • 举例:在一个Service类中,有一个方法A调用另一个方法B,A和B都使用@Transactional注解,并且没有指定传播行为。这时,B会加入到A的事务中,或者如果A没有事务,B会创建一个新的事务。
  2. SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。这种传播行为适用于对事务要求不严格的读操作。

    • 举例:如果方法A在事务中调用了方法B,但B使用了@Transactional(propagation = Propagation.SUPPORTS)注解,那么B将在A的事务中运行,如果A没有事务,B将以非事务方式运行。
  3. MANDATORY:使用当前的事务,如果当前没有事务,则抛出异常。它强制要求必须在一个已经存在的事务中执行。

    • 举例:如果方法A没有事务,而方法B使用了@Transactional(propagation = Propagation.MANDATORY)注解,那么调用B时会抛出异常。
  4. REQUIRES_NEW:创建一个新的事务,并且暂停当前事务(如果存在)。新事务完成后,原始事务才能继续执行。这种传播行为通常用于需要独立事务的场景。

    • 举例:方法A在事务中调用了方法B,但B使用了@Transactional(propagation = Propagation.REQUIRES_NEW)注解,那么B将创建一个新的事务,而A的事务会被暂停,直到B的事务完成。
  5. NOT_SUPPORTED:以非事务方式执行操作,如果存在事务,就把当前事务挂起。通常用于需要在无事务状态下运行的批处理操作。

    • 举例:如果方法A在事务中调用了方法B,但B使用了@Transactional(propagation = Propagation.NOT_SUPPORTED)注解,那么B将以非事务方式运行,同时A的事务会被挂起。
  6. NEVER:以非事务方式执行,如果存在事务,则抛出异常。它确保操作不会在事务中被执行。

    • 举例:如果方法A在事务中调用了方法B,但B使用了@Transactional(propagation = Propagation.NEVER)注解,那么调用B时会抛出异常。
  7. NESTED:如果当前存在事务,则在嵌套事务内执行。如果没有活动事务,则与PROPAGATION_REQUIRED类似。它允许你在一个现有的事务中开启新的“事务”,以便能够在出现异常时仅回滚部分操作。

    • 举例:方法A在事务中调用了方法B,B使用了@Transactional(propagation = Propagation.NESTED)注解,那么B将在A的事务中开启一个嵌套事务。如果B中发生异常并标记为回滚,只有B的更改会被回滚,而A的事务仍然可以继续。

了解这些传播行为对于正确配置和管理Spring中的事务非常重要。通过合理地使用这些传播行为,可以确保业务逻辑的正确执行,同时避免事务相关的常见问题,如死锁和不一致的数据状态。在实际开发中,应根据具体的业务需求和场景选择合适的传播行为来优化事务管理。

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

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

相关文章

【Leetcode每日一题】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(难度⭐⭐)(18)

1. 题目解析 Leetcode链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于找到给定目标值所在的数组下标区间&#xff0c;设计一个O(logn)的算法。 2. 算法原…

探索无限:Sora与AI视频模型的技术革命 - 开创未来视觉艺术的新篇章

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

Layer1 明星项目 Partisia Blockchain 何以打造互操作、可创新的数字经济网络

我们的目标是创建一个以用户为中心的全新数字经济网络&#xff1a;在去信任化和公平透明的环境下&#xff0c;所有的隐私数据都能够得到天然保障&#xff0c;企业、用户等各角色的协作与共享将会更顺利地进行。 —— Partisia Blockchain 团队 作为一个以 Web3 安全为技术方向的…

【wails】(4):使用wails做桌面应用开发,整合chatgpt-web项目做前端,进行本地开发,web端也可以连调,使用websocket实现

1&#xff0c;视频地址 【wails】&#xff08;4&#xff09;&#xff1a;使用wails做桌面应用开发&#xff0c;整合chatgpt-web项目做前端&#xff0c;进行本地开发&#xff0c;web端也可以连调&#xff0c;使用websocket实现 2&#xff0c;演示效果 启动先是报500 错误&#…

Zoho ToDo 满足您的需求:任务管理满足隐私和安全要求

任务管理工具已经成为我们日常生活中不可或缺的一部分&#xff0c;它们帮助我们处理各种事务&#xff0c;从杂项和愿望清单到管理截止日期和资源。这些工具不仅仅是简单的任务列表&#xff0c;它们掌握了项目的蓝图、雄心勃勃的目标和完成的最后期限。然而随着这些工具的使用越…

R语言空间分析、模拟预测与可视化

随着地理信息系统&#xff08;GIS&#xff09;和大尺度研究的发展&#xff0c;空间数据的管理、统计与制图变得越来越重要。R语言在数据分析、挖掘和可视化中发挥着重要的作用&#xff0c;其中在空间分析方面扮演着重要角色&#xff0c;与空间相关的包的数量也达到130多个。在本…

Github代码仓库SSH配置流程

作者&#xff1a; Herman Ye Auromix 测试环境&#xff1a; Ubuntu20.04 更新日期&#xff1a; 2024/02/21 注1&#xff1a; Auromix 是一个机器人爱好者开源组织。 注2&#xff1a; 由于笔者水平有限&#xff0c;以下内容可能存在事实性错误。 相关背景 在为Github代码仓库配…

【服务器数据恢复】ext3文件系统下硬盘坏道掉线的数据恢复案例

服务器数据恢复环境&#xff1a; 一台IBM某型号服务器上有16块FC硬盘组建RAID阵列。上层linux操作系统&#xff0c;ext3文件系统&#xff0c;部署有oracle数据库。 服务器故障&检测&#xff1a; 服务器上跑的业务突然崩溃&#xff0c;管理员发现服务器上有2块磁盘的指示灯…

第 2 章 微信小程序的构成 (代码导读)断更,后续继续更新

2.1 小程序项目的基本结构 Hello World&#xff01;程序.mp4 文泉云盘 -- 图书二维码资源管理系统兆泰源二维码管理系统https://www.wqyunpan.com/resourceDetail.html?id284928&openIdoUgl9wdyNYHu9EcAe-GEwbQdZilY&qrcodeId242916&signc2lnbm1PUmNxSndPWGFOck…

DevOps 周期的 6 个 C

中型到大型软件开发项目涉及许多人员、多个团队、资源、工具和开发阶段。它们都需要以某种方式进行管理和简化&#xff0c;不仅可以获得所需的产品&#xff0c;而且还要确保将来在不断变化的环境下易于管理和维护。组织通常遵循许多项目管理模型和技术。DevOps 是其中之一&…

设计模式(五)-观察者模式

前言 实际业务开发过程中&#xff0c;业务逻辑可能非常复杂&#xff0c;核心业务 N 个子业务。如果都放到一块儿去做&#xff0c;代码可能会很长&#xff0c;耦合度不断攀升&#xff0c;维护起来也麻烦&#xff0c;甚至头疼。还有一些业务场景不需要在一次请求中同步完成&…

数字孪生的技术开发平台

数字孪生的开发平台可以基于各种软件和硬件工具来实现&#xff0c;这些平台提供了丰富的功能和工具&#xff0c;帮助开发人员构建、部署和管理数字孪生系统&#xff0c;根据具体的需求和技术要求&#xff0c;开发人员可以选择合适的平台进行开发工作。以下列举了一些常见的数字…

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(9)模型优化

模型训练后&#xff0c;就要进行模型优化了。 一般来讲&#xff0c;很简单&#xff0c;优化就是不换模型换参数&#xff0c;或者直接换模型。 换了之后来对比&#xff0c;最后选个最好的。 比如在本案例中&#xff0c;选择LinearRegression后&#xff0c;MSE从22下降到12&am…

机器学习——线性代数中矩阵和向量的基本介绍

矩阵和向量的基本概念 矩阵的基本概念&#xff08;这里不多说&#xff0c;应该都知道&#xff09; 而向量就是一个特殊的矩阵&#xff0c;即向量只有一列&#xff0c;是个n*1的矩阵 注&#xff1a;一般矩阵用大写字母表示&#xff0c;向量用小写字母表示 矩阵的加减运算 两个…

架构设计实践:熟悉架构设计方法论,并动手绘制架构设计图

文章目录 一、架构设计要素1、架构设计目标2、架构设计模式&#xff08;1&#xff09;分而治之&#xff08;2&#xff09;迭代式设计 3、架构设计的输入&#xff08;1&#xff09;概览&#xff08;2&#xff09;功能需求 - WH分析法&#xff08;3&#xff09;质量 - “怎么”分…

基于容器和集群技术的数据自动化采集设计和实现

目标&#xff1a;部署mysql服务容器并使用docker构建包含python爬虫脚本的容器采集数据到mysql数据库。 环境&#xff1a;Centos7、已配置Kubernetes集群及docker。 环境配置请参考以下文章&#xff1a; CentOS7搭建Kubernetes集群 Kubernetes集群信息如下(虚拟机主机名和IP…

搭建Facebook直播网络对IP有要求吗?

在当今数字化时代&#xff0c;Facebook直播已经成为了一种极具吸引力的社交形式&#xff0c;为个人和企业提供了与观众直接互动的机会&#xff0c;成为推广产品、分享经验、建立品牌形象的重要途径。然而&#xff0c;对于许多人来说&#xff0c;搭建一个稳定、高质量的Facebook…

[Docker 教学] 常用的Docker 命令

Docker是一种流行的容器化技术。使用Docker可以将数据科学应用程序连同代码和所需的依赖关系打包成一个名为镜像的便携式工件。因此&#xff0c;Docker可以简化开发环境的复制&#xff0c;并使本地开发变得轻松。 以下是一些必备的Docker命令列表&#xff0c;这些命令将在你下一…

Open CASCADE学习|GC_MakeArcOfCircle构造圆弧

目录 1、通过圆及圆的两个参数创建圆弧&#xff0c;参数为弧度角 2、通过圆及圆上的一点、圆的1个参数创建圆弧&#xff0c;参数为弧度角&#xff0c;Sense决定方向 3、通过圆及圆上的两个点创建圆弧&#xff0c;Sense决定方向 4、通过三点创建圆弧&#xff0c;最后一点应安…

设计模式学习笔记 - 面向对象 - 8.实践:贫血模型和充血模型的原理及实践

1.Web开发常用的贫血MVC架构违背OOP吗&#xff1f; 前面我们依据讲过了面向对象四大特性、接口和抽象类、面向对象和面向过程编程风格&#xff0c;基于接口而非实现编程和多用组合少用继承设计思想。接下来&#xff0c;通过实战来学习如何将这些理论应用到实际的开发中。 大部…