有没有教做韩餐的网站,专业做网站开发费用,上海先进网站建设公司,虚拟主机与网站建设博主社群介绍#xff1a; ① 群内初中生、高中生、本科生、研究生、博士生遍布#xff0c;可互相学习#xff0c;交流困惑。
② 热榜top10的常客也在群里#xff0c;也有数不清的万粉大佬#xff0c;可以交流写作技巧#xff0c;上榜经验#xff0c;涨粉秘籍。
③ 群内也…博主社群介绍 ① 群内初中生、高中生、本科生、研究生、博士生遍布可互相学习交流困惑。 ② 热榜top10的常客也在群里也有数不清的万粉大佬可以交流写作技巧上榜经验涨粉秘籍。 ③ 群内也有职场精英大厂大佬跨国企业主管可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份助你由写作小白晋升为创作大佬进群赠送CSDN评论防封脚本送真活跃粉丝助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/CSDN自动化运营脚本 有兴趣的加文末联系方式备注自己的CSDN昵称拉你进群互相学习共同进步。文章目录Spring 机制六 MVC 全链路源码解析从 DispatcherServlet 到返回值解析超硬核源码深度目录1. Spring MVC 架构与整体链路总览2. DispatcherServlet 初始化流程源码解析DispatcherServlet#onRefreshinitStrategies 装配 MVC 全套组件3. 请求分发核心doDispatch4. HandlerMapping如何找到 ControllerRequestMappingHandlerMapping 工作流程5. HandlerAdapter如何调用 Controller 方法HandlerAdapter 调用链源码6. 参数解析器ArgumentResolver内部原理7. 返回值处理器ReturnValueHandler链路8. 拦截器执行顺序9. Controller 调用链全景图10. Spring MVC 与 AOP 如何协作11. 实战自定义参数解析器1定义注解2自定义解析器3注册解析器4Controller 使用12. 超级总图Spring MVC 全链路流程图13. 参考文档结束语Spring 机制六 MVC 全链路源码解析从 DispatcherServlet 到返回值解析超硬核源码深度目录Spring MVC 的整体架构与执行链路总览DispatcherServlet 初始化流程源码请求分发核心doDispatch 全链路解析HandlerMapping 的查找过程HandlerAdapter 的适配与调用参数解析器Argument Resolver内部原理返回值处理器ReturnValueHandler链路拦截器执行顺序Controller 方法调用链全景图Mermaid与 AOP 如何协同实战自定义参数解析器Mermaid 超级总图从请求进入到响应输出参考文档1. Spring MVC 架构与整体链路总览Spring MVC 的核心处理流程可以抽象为HTTP 输入 → DispatcherServlet → HandlerMapping → HandlerAdapter → 参数解析 → 调用 Controller 方法 → 返回值解析 → 视图解析 → HTTP 输出整体流程 Mermaid 展示找到 HandlerHTTP 请求DispatcherServletHandlerMappingHandlerMethodHandlerAdapter参数解析 ArgumentResolver调用目标方法返回结果ReturnValueHandlerViewResolver渲染视图HTTP Response2. DispatcherServlet 初始化流程源码解析DispatcherServlet 是 Spring MVC 核心入口点继承链FrameworkServlet → HttpServletBean → HttpServletDispatcherServlet#onRefreshOverrideprotectedvoidonRefresh(ApplicationContextcontext){initStrategies(context);}initStrategies 装配 MVC 全套组件protectedvoidinitStrategies(ApplicationContextcontext){initMultipartResolver(context);initLocaleResolver(context);initThemeResolver(context);initHandlerMappings(context);initHandlerAdapters(context);initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);initViewResolvers(context);}重点HandlerMappingHandlerAdapterViewResolver都是在这里完成自动装配属于 MVC 的“预热阶段”。3. 请求分发核心doDispatch核心路径FrameworkServlet#doService → DispatcherServlet#doDispatch简化源码protectedvoiddoDispatch(HttpServletRequestrequest,HttpServletResponseresponse){HandlerExecutionChainmappedHandlergetHandler(request);HandlerAdapterhagetHandlerAdapter(mappedHandler.getHandler());if(!mappedHandler.applyPreHandle(request,response)){return;}ModelAndViewmvha.handle(request,response,mappedHandler.getHandler());mappedHandler.applyPostHandle(request,response,mv);processDispatchResult(request,response,mappedHandler,mv);}4. HandlerMapping如何找到 Controller职责根据 URL 找到对应 Controller 的 HandlerMethod常见 HandlerMapping类型用途RequestMappingHandlerMapping处理 RequestMapping 体系BeanNameUrlHandlerMappingBean 名称即 URLSimpleUrlHandlerMappingXML 配置 URLSpring Boot 默认使用 RequestMappingHandlerMapping。RequestMappingHandlerMapping 工作流程启动时扫描所有Controller/RestControllerRequestMapping方法构建MapRequestMappingInfo, HandlerMethod请求时执行publicHandlerExecutionChaingetHandler(HttpServletRequestrequest){returnthis.mappingRegistry.getMappings().entrySet().stream().filter(entry-entry.getKey().getPatternsCondition().match(request)).findFirst().map(entry-newHandlerExecutionChain(entry.getValue())).orElse(null);}5. HandlerAdapter如何调用 Controller 方法Spring MVC 支持多种 HandlerAdapterAdapter用途RequestMappingHandlerAdapter注解 Controller 方法调用HttpRequestHandlerAdapter支持 HttpRequestHandlerSimpleControllerHandlerAdapter早期 Controller 模式默认使用 RequestMappingHandlerAdapter负责参数绑定参数解析器链返回值解析器链调用 HandlerMethodHandlerAdapter 调用链源码publicModelAndViewhandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler){returninvokeHandlerMethod(request,response,(HandlerMethod)handler);}6. 参数解析器ArgumentResolver内部原理核心类HandlerMethodArgumentResolverComposite流程foreach parameter:1.找到 supportsParametertrue的 resolver2.调用 resolver.resolveArgument()常见解析器解析器用途RequestParamMethodArgumentResolverRequestParamPathVariableMethodArgumentResolverPathVariableRequestResponseBodyMethodProcessorRequestBodyServletRequestMethodArgumentResolverHttpServletRequest源码执行publicObjectresolveArgument(...){HandlerMethodArgumentResolverresolvergetResolver(parameter);returnresolver.resolveArgument(parameter,mavContainer,request,binderFactory);}7. 返回值处理器ReturnValueHandler链路控制器方法返回值交给 HandlerMethodReturnValueHandlerComposite常见解析器类型用途RequestResponseBodyMethodProcessorResponseBodyModelAndViewMethodReturnValueHandlerModelAndViewViewNameMethodReturnValueHandler视图名HttpEntityMethodProcessorResponseEntityCallableMethodReturnValueHandler异步 Callable源码流程HandlerMethodReturnValueHandlerhandlerselectHandler(returnType);handler.handleReturnValue(returnValue,returnType,mavContainer,request);8. 拦截器执行顺序HandlerExecutionChainpreHandle() → Controller → postHandle() → afterCompletion()源码示例if(!interceptor.preHandle())return;handler.invoke();interceptor.postHandle();interceptor.afterCompletion();preHandle 顺序执行afterCompletion 倒序执行类似异常栈。9. Controller 调用链全景图ClientDispatcherHandlerMappingHandlerAdapterArgumentResolversControllerReturnValueHandlersViewHTTP 请求getHandler()HandlerMethodgetHandlerAdapter()resolve arguments()参数集合调用方法返回数据handleReturnValue()ModelAndView渲染HTML/JSONClientDispatcherHandlerMappingHandlerAdapterArgumentResolversControllerReturnValueHandlersView10. Spring MVC 与 AOP 如何协作AOP 代理发生在 BeanPostProcessor 阶段Controller 本身是代理对象HandlerMapping 匹配的 HandlerMethod 是代理方法AOP 的 MethodInterceptor 包裹 Controller 调用请求链路HTTP → DispatcherServlet → HandlerAdapter → AOP Proxy → Controller11. 实战自定义参数解析器目标自动解析 HeaderX-User-Id1定义注解Target(ElementType.PARAMETER)Retention(RetentionPolicy.RUNTIME)publicinterfaceUserId{}2自定义解析器publicclassUserIdArgumentResolverimplementsHandlerMethodArgumentResolver{OverridepublicbooleansupportsParameter(MethodParameterparameter){returnparameter.hasParameterAnnotation(UserId.class);}OverridepublicObjectresolveArgument(MethodParameterparameter,ModelAndViewContainermavContainer,NativeWebRequestwebRequest,WebDataBinderFactorybinderFactory){returnwebRequest.getHeader(X-User-Id);}}3注册解析器ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{OverridepublicvoidaddArgumentResolvers(ListHandlerMethodArgumentResolverresolvers){resolvers.add(newUserIdArgumentResolver());}}4Controller 使用GetMapping(/me)publicStringme(UserIdStringuid){returnuiduid;}12. 超级总图Spring MVC 全链路流程图HTTP 请求进入DispatcherServlet#doDispatchHandlerMapping 匹配 HandlerMethodHandlerAdapter 选择解析器链 ArgumentResolversController 方法调用返回值处理器 ReturnValueHandlers视图解析 ViewResolver渲染 ViewHTTP Response 输出13. 参考文档Spring MVC 官方文档https://docs.spring.io/spring-framework/reference/web/webmvc.htmlSpring Framework GitHubhttps://github.com/spring-projects/spring-frameworkHandlerMethod 官方说明https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/method/HandlerMethod.html结束语 关于我持续学习 | 追求真我如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的。想看更多 那就点个关注吧 我会尽力带来有趣的内容 。感谢订阅专栏 三连文章掘金点击访问Qiuner CSDN点击访问Qiuner GitHub点击访问Qiuner Gitee点击访问Qiuner专栏简介 一图读懂系列图文并茂轻松理解复杂概念 一文读懂系列深入浅出全面解析技术要点持续更新保持学习不断进步 人生经验经验分享共同成长你好,我是Qiuner.为帮助别人少走弯路而写博客如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 (^ ~ ^) 。想看更多 那就点个关注吧 我会尽力带来有趣的内容 。代码都在Github或Gitee上如有需要可以去上面自行下载。记得给我点星星哦如果你遇到了问题自己没法解决可以去我掘金评论区问。CSDN评论区和私信消息看不完 掘金消息少一点.上一篇推荐链接Java程序员快又扎实的学习路线点击该处自动跳转查看哦一文读懂 AI点击该处自动跳转查看哦一文读懂 服务器点击该处自动跳转查看哦2024年创作回顾点击该处自动跳转查看哦一文读懂 ESLint配置点击该处自动跳转查看哦老鸟如何追求快捷操作电脑点击该处自动跳转查看哦未来会写什么文章预告链接一文读懂 XX点击该处自动跳转查看哦2025年终总结点击该处自动跳转查看哦一图读懂 XX点击该处自动跳转查看哦