一、springmvc启动加载流程

1、引入spring-web.jar包时,在这个包的META-INF/services/javax.servlet.ServletContainerInitializer文件中定义的加载类SpringServletContainerInitializer,提供给springmvc实现初始化的操作。

2、在SpringServletContainerInitializer类中,通过@HandlesTypes来引入WebApplicationInitializer。

3、自己自定义的启动类只要继承了WebApplicationInitializer类并实现了onStartUp方法,那么servlet容器在启动的时候就会拿到自己自定义的启动类,并开始启动。

启动原理:servlet容器在初始化的时候会加载到SpringServletContainerInitializer类,然后这个类中通过@HandlesTypes来引入WebApplicationInitializer子类,然后回调传递ServletContext上下文,此处使用的是模板方法。

springmvc是如何来替代web.xml的?核心就是使用的SpringServletContainerInitializer类。

二、拦截器与过滤器区别

相同点:

        拦截器和过滤器都是基于Aop实现,能够对请求执行之前和之后实现拦截。

不同点:

        过滤器是基于Servlet容器实现,对Web请求之前和之后实现拦截

        拦截器不需要依赖于Servlet、不仅可以实现Web请求进行拦截,还有对其他方法拦截等。

        过滤器比拦截器先执行,拦截器封装的方法比过滤器拦截使用起来更加简单。

应用场景:

        拦截器:权限控制、日志打印、参数验证、会话信息。

        过滤器:编码转换、跨域解决、xss攻击。

三、DispatcherServlet底层源码分析

1.执行doDispatch;

2.调用getHandler方法获取请求目标的方法  也就是  请求url映射路径对应的控制层具体的方法;

handlerMappings的作用查找控制器位置,比如xml和注解方式;

3.调用getHandlerAdapter获取控制层适配器 RequestMappingHandlerAdapter;

4.执行拦截器前置方法 preHandle() 如果返回为true的话;

5.执行实际请求目标方法 返回modeAndView对象;

6.执行拦截器PostHandle()方法;

7.设置渲染视图层内容;

8.执行拦截器afterCompletion方法;

四、SpringMVC控制对象初始化流程

1、HttpServletBean类的init() 方法2、FrameworkServlet类的initServletBean() 方法 →  initWebApplicationContext()3、DispatcherServlet类的onRefresh() 方法 →  initStrategies()方法
protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);//初始化上传文件解析器(或者是多部分请求解析器)initLocaleResolver(context);//初始化本地化解析器initThemeResolver(context);//初始化主题解析器initHandlerMappings(context);//初始化处理器映射器initHandlerAdapters(context);//初始化处理器适配器initHandlerExceptionResolvers(context);//初始化处理器异常解析器initRequestToViewNameTranslator(context);//初始化请求到视图名翻译器initViewResolvers(context);//初始化视图解析器initFlashMapManager(context);//初始化重定向数据管理器
}

五、SpringMVC中的适配器

        适配器模式:将一个系统的接口转换成另外一种形式,从而使原来不能直接调用的接口变得可以调用。使用适配器可以针对不容的handler类型找到不同的适配器来实现执行目标方法。

SpringMVC中有以下几种适配器:

1、继承Controller方式所使用的适配器:SimpleControllerHandlerAdapter

2、 HTTP请求处理器适配器:HttpRequestHandlerAdapter

3、注解方式(@Controller)的处理器适配器:RequestMappingHandlerAdapter

适配器模式应用场景

1.   Mybatis多种日志框架的整合(logback、log4j)

2.   SpringMVC适配器模式

3.   新老版本的兼容问题

适配器模式源码分析

1.使用getHandlerAdapter获取对应的hanlder的具体HandlerAdapter2.HandlerAdapter接口有如下的子 c处理请求适配器2.1继承Controller方式所使用的适配器:SimpleControllerHandlerAdapter2.2 HTTP请求处理器适配器:HttpRequestHandlerAdapter 2.3注解方式(@Controller)的处理器适配器:RequestMappingHandlerAdapter如果不采用适配器的话 :
If(hanlder instanceof Controller){// 执行Controller适配器
}If(hanlder instanceof  HttpControler){// 执行我们的HttpController
}If(hanlder instanceof  ServletControler){// 执行我们的HttpController
}If(hanlder instanceof  AnnotationControler){// 执行我们的AnnotationController
}

六、SpringMvc异步实现方式

异步支持需要注意的两个地方

* 1、config类中开启异步@EnableAsync

* 2、初始化类中 dynamic.setAsyncSupported(true);//开启springmvc异步

1、第一种方式:直接在接口上添加@Async注解来实现

@Async
public String getMember(){try {System.out.println("2、业务处理开始,线程名称"+Thread.currentThread().getContextClassLoader());Thread.sleep(3000);System.out.println("3、业务处理完毕,线程名称"+Thread.currentThread().getContextClassLoader());}catch (Exception e){e.printStackTrace();}return "member";
}

2、第二种方式:使用Callable类的方式

/*** 异步支持需要注意的两个地方* 1、config类中开启异步@EnableAsync* 2、初始化类中 dynamic.setAsyncSupported(true);//开启springmvc异步* Callable这种方式也是需要等业务线程处理完毕后,才会返回给客户端,为了避免等待时间,可以在客户端写一个定时器来查询处理结果*/
@RequestMapping("/asyncMember")
@ResponseBody
public Callable<String> asyncMember(){Callable<String> callable = new Callable<String>() {public String call() throws Exception {//耗时的时间都可以放在这个里面去处理String member = memberService.getMember();return member;}};return callable;
}

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

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

相关文章

【ESP32-menuconfig(1) -- Build Type及Bootloader config】

Build Type Bootloader configmenuconfig介绍Build typeCONFIG_APP_BUILD_TYPECONFIG_APP_BUILD_TYPE_PURE_RAM_APPCONFIG_APP_REPRODUCIBLE_BUILDCONFIG_APP_NO_BLOBSCONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERSCONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERSBootloader config…

C++信息学奥赛一本通-第一部分-基础一-第3章-第1节

C信息学奥赛一本通-第一部分-基础一-第3章-第1节 2051 偶数 #include <iostream>using namespace std;int main() {int number; cin >> number;if (number % 2 0) {cout << "yes";} }2052 范围判断 #include <iostream>using namespace std…

自由学习记录(79)

PBRBRDF原理&Unity实现深入浅出_哔哩哔哩_bilibili 进行改进 一个像素点对应一个范围内的 一个微表面--一个由无数个起起伏伏的结构组成的物理结构 屏幕上的每一个像素点&#xff0c;在渲染时通常会被视为一个“微表面”的代表 比如在这个图中&#xff0c;只关心红色的区…

复杂路况误报率↓78%!陌讯轻量化模型在车辆违停识别的边缘计算优化​

一、行业痛点&#xff1a;动态交通场景的识别困境据《2024中国智慧交通白皮书》统计&#xff0c;城市核心路段违停误报率高达35%&#xff0c;主要源于两大难点&#xff1a;​​短暂停靠干扰​​&#xff1a;出租车临时停靠与违停行为特征重叠​​复杂背景干扰​​&#xff1a;树…

大语言模型提示工程与应用:提示词基础使用方式

提示词使用方式 学习目标 在本课程中&#xff0c;我们将学习更多关于提示词使用方式。 相关知识点 提示词使用 学习内容 1 提示词使用 1.1 文本摘要 语言模型最典型的应用场景之一就是文本摘要。我们可以通过以下提示实现基础摘要功能&#xff1a; 提示: 解释抗生素是什么回答&…

常见命令-资源查看-iostat命令实践

文章目录 系统中未安装 iostat 命令 1. 监控CPU与磁盘的基础负载 2. 诊断I/O性能瓶颈 3. 实时监控与动态采样 4. 特定设备或分区的精细化监控 5. 性能测试与基准数据生成 6. 结合其他工具进行综合调优 总结 结果输出速查表 第一部分:CPU统计信息 第二部分:设备/磁盘统计信息(…

WinForm 实战 (进度条):用 ProgressBar+Timer 打造动态进度展示功能

目录 核心控件解析​ ProgressBar 进度条​ Timer 定时器​ 实战案例 常见应用场景​ 总结​ 在 WinForm 桌面应用开发中&#xff0c;进度反馈是提升用户体验的关键环节。无论是文件处理、数据加载还是复杂计算&#xff0c;一个直观的进度条能让用户清晰了解任务状态&…

使用 ast-grep 精准匹配指定类的方法调用(以 Java 为例)

使用 ast-grep 精准匹配指定类的方法调用&#xff08;以 Java 为例&#xff09; 在代码重构、安全审计或静态分析的场景中&#xff0c;我们常常需要匹配某个特定类中定义的方法调用。而 ast-grep 作为一款基于语法树的代码搜索工具&#xff0c;提供了强大的模式匹配功能&#…

Dijkstra?spfa?SPstra?

带负权的无负环最短路问题 对于一张有负边权的图&#xff0c;普通 Dijkstra 就不能用了&#xff0c;比如&#xff1a;正常的 Dijkstra 扩散的节点依次为 1,3,2,41,3,2,41,3,2,4。 这时候可以发现&#xff0c;当点 222 扩散的时候&#xff0c;原本达到点 333 的路径长度是 111&a…

React函数组件灵魂搭档:useEffect深度通关指南!

你以为它只是替代componentDidMount&#xff1f;数据抓取、事件绑定、定时清理...&#xff1f;事实上&#xff0c;useEffect才是函数组件的“幕后操控者”&#xff01;但依赖数组的坑、闭包的陷阱&#xff0c;你真的玩转了吗&#xff1f; 告别“能用就行”&#xff0c;今天带你…

LabVIEW实验室测试框架

在实验室测试场景中&#xff0c;选用合适的 LabVIEW 框架能够极大提升测试效率、优化测试流程并保障测试结果的准确性。介绍几款常用且功能强大的 LabVIEW 测试框架&#xff1a;​TestStand​框架概述​TestStand 是 NI 公司专为测试系统开发设计的一款测试执行管理框架。它能够…

Kiro :从“规范”到“实现”的全流程 AI 助手

为什么是 Kiro Kiro 是一款面向“规范驱动开发”&#xff08;Spec-Driven Development&#xff09;的 AI 开发助手。与只在“写代码”环节辅助不同&#xff0c;Kiro 将“从需求到设计再到实现”的完整链路显性化&#xff0c;把需求、设计、任务分解、代码与测试、文档等全部纳…

【0基础PS】PS工具详解--矩形工具

目录前言一、矩形工具的基础认知​二、矩形工具的选项栏详解​三、矩形工具的绘制技巧​四、矩形工具的实际应用场景​五、常见问题与解决方案​总结前言 在 Photoshop&#xff08;简称 PS&#xff09;的众多绘图工具中&#xff0c;矩形工具是使用率极高的基础工具之一。无论是…

移动端app专项测试

学习目标&#xff1a;app专项测试知识点&#xff0c;其他知识扩充一、app专项&#xff08;app怎么测试/app侧重点在哪&#xff09;1.功能&#xff1a;跟前面功能测试一样&#xff08;跟需求文档提取测试点&#xff0c;编写测试用例&#xff09;2.安装1.不同品牌安装,不同操作系…

Spring Boot 结合 CORS 解决前端跨域问题

Spring Boot 结合 CORS 解决前端跨域问题 1. 背景 在前后端分离的项目中&#xff0c;前端&#xff08;例如 http://localhost:3000&#xff09;调用后端接口&#xff08;例如 http://localhost:8080&#xff09;时&#xff0c;浏览器会因为 同源策略 限制而阻止请求&#xff0c…

GPT-5 发布:微小进步难掩瓶颈,AI 行业或迎冷静

北京时间 8 月 8 日凌晨,OpenAI 的 GPT-5 在万众期待中登场。距离 GPT-4 发布已过去两年半,然而这场发布会却未重现 ChatGPT 初现时的惊艳,也没有 GPT-4 的跨越式升级,更无 o1 发布时的震撼。1 小时 20 分钟的发布会,充斥着不惊艳的测试数据、与竞品难分高下的用例展示,甚…

僵尸进程、孤儿进程、进程优先级、/proc 文件系统、CRC 与网络溢出问题处理(实战 + 原理)

僵尸进程 / 孤儿进程&#xff1a;是什么、为什么会出现、如何定位与清理进程优先级&#xff1a;nice/priority、CFS 与实时调度、I/O 优先级、cgroup 限流/proc 文件系统&#xff1a;最常用路径与诊断手法CRC 校验&#xff1a;在存储/网络里的作用与局限、抓包“校验错误”的常…

GPT-5 不仅是版本升级,它标志着 推理能力的商业化 和 Agent操作系统 的崛起,开启了 AI革命时代。

GPT-5 不仅是版本升级&#xff0c;它标志着 推理能力的商业化 和 Agent操作系统 的崛起&#xff0c;开启了 AI革命时代。 核心技术亮点&#xff1a; 商业化推理能力&#xff1a;AI不仅生成文本&#xff0c;还能 自动解决复杂任务&#xff0c;提升工作效率。 Agent操作系统&…

【C#】掌握并发利器:深入理解 .NET 中的 Task.WhenAll

在现代 .NET 应用程序开发中&#xff0c;异步编程&#xff08;Asynchronous Programming&#xff09;已成为提升性能、改善响应能力和充分利用多核处理器的关键技术。async 和 await 关键字极大地简化了异步代码的编写&#xff0c;而 Task 类则是这一模型的核心。在处理多个并发…

微型导轨在半导体制造中有哪些高精密应用场景?

微型导轨在半导体制造中用于晶圆对准和定位系统&#xff0c;确保晶圆在光刻、蚀刻等工艺中精确移动。其高精度、高刚性、低摩擦和紧凑设计等特性&#xff0c;使其成为半导体设备实现微米级运动控制的核心部件。光刻机&#xff1a;在光刻工艺中&#xff0c;微型导轨支撑并引导掩…