SpringMVC基础源码分析(一)
实现Controller的三种方式分析
每种实现的方式对应的HanderAdapter都不同。
实现Controller接口
该接口对应的HanderAdapter为SimpleControllerHandlerAdapter。

使用案列:
public class LeController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 创建数据视图类
ModelAndView mv = new ModelAndView();
// 填充数据
mv.addObject("msg","北方情韵");
// 跳转的视图
mv.setViewName("index");
return mv;
}
}
配置对应的bean信息,这里的name就是访问该Controller的路径。
<bean class="cn.lele.controller.LeController" name="/le" />

我们可以通过debug那个执行链就可以知道。

实现HttpRequestHandler接口
该接口对应的HanderAdapter为HttpRequestHandlerAdapter。

使用案例:
public class YueController implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("msg","实现接口HttpRequestHandler");
request.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(request,response);
}
}
配置对应的bean信息,这里的name就是访问该Controller的路径。
<bean class="cn.lele.controller.YueController" name="/yue" />

继续查看当前对象的执行链:

这两种方式大体上是类似的,我们可以区别的看一下,他们是怎么处理的。
先看实现HttpRequestHandlerAdapter接口的:

进入1075行代码:

可以发现,这是把当前Controller强转为HttpRequestHander,然后再执行HttpRequestHanderAdapter的handleRequest方法。(实际就是去执行我们Controller里面的方法。)

而HttpRequestHandler正是我们Contoller类实现的HttpRequestHandler。

同理,我们去看一下实现Controller接口的类的处理方法。

一样,都是先强转为接口类,然后执行对应的方法,也就是我们自己实现的方法:

注意:当前的所处位置:
使用注解的方式
待补充
探究HandlerAdapter的装配规则
一直都很疑惑:
为什么不装配全部都能用,只装配一种,不符合的就不能用了呢?
未配置HandlerAdapter
观察DispatcherServlet的初始化方法:
可以看到有对HandlerAdapter的初始化,点进去加断点。

开始Debug:


根据注释,我们可以知道如果此时HandlerAdapters如果为空的话将加载初始化的HandlerAdapters

可以看到,在664行加载了四个HandlerAdapter

进入此方法继续debug查看:
注意:
DispatcherServlet的初始化方法只执行一次,后面需要重新启动tomcat才能继续进入初始化方法。

重启后,继续Debug:


往下走,可以看到这里读取到了几个HandlerAdapter

很明显872行代码是读取了什么文件

重新Debug可以发现这里读取的是org/springframework/web/servlet/DispatcherServlet.properties文件。

DispatcherServlet.properties:
......
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
org.springframework.web.servlet.function.support.HandlerFunctionAdapter
......
文件里内容不少,我这里只留下了HandlerAdapter的信息了
继续往下看怎么处理的:
下面我感觉应该是利用泛型和反射得到所有的处理器。

配置了HandlerAdapter
如果我们再容器中装配了Adapter:

重启tomcat,继续Debug

可以看到642行读取到了我们配置的两个HandlerAdapter,并且再645行赋值给了DispatcherServlet的handlerAdapters,此时方法就会结束了。因为下面都不符合条件了。

总结:
如果我们在容器里添加了HandlerAdapter,那么就不会通过读取本地的文件添加默认的四个HandlerAdapter。
如果没在容器中添加HandlerAdapter,机会读取本地的DispatcherServlet.properties里面的四个HandlerAdapter。
SpringMVC基础源码分析(一)的更多相关文章
- SpringBoot中Tomcat和SpringMVC整合源码分析
概述 SpringBoot中集成官方的第三方组件是通过在POM文件中添加组件的starter的Maven依赖来完成的.添加相关的Maven依赖之后,会引入具体的jar包,在SpringBoot启动 ...
- SpringMVC源码分析系列
说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...
- Spring源码分析专题——目录
Spring源码分析专题 -- 阅读指引 IOC容器 Spring源码分析专题 -- IOC容器启动过程(上篇) Spring源码分析专题 -- IOC容器启动过程(中篇) Spring源码分析专题 ...
- SpringMVC拦截器详解[附带源码分析]
目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...
- SpringMVC视图机制详解[附带源码分析]
目录 前言 重要接口和类介绍 源码分析 编码自定义的ViewResolver 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门bl ...
- 详解SpringMVC请求的时候是如何找到正确的Controller[附带源码分析]
目录 前言 源码分析 重要接口介绍 SpringMVC初始化的时候做了什么 HandlerExecutionChain的获取 实例 资源文件映射 总结 参考资料 前言 SpringMVC是目前主流的W ...
- SpringMVC类型转换、数据绑定详解[附带源码分析]
目录 前言 属性编辑器介绍 重要接口和类介绍 部分类和接口测试 源码分析 编写自定义的属性编辑器 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那 ...
- [转]SpringMVC拦截器详解[附带源码分析]
目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...
- springMVC容器加载源码分析
springmvc是一个基于servlet容器的轻量灵活的mvc框架,在它整个请求过程中,为了能够灵活定制各种需求,所以提供了一系列的组件完成整个请求的映射,响应等等处理.这里我们来分析下spring ...
- SpringMVC拦截器详解[附带源码分析](转)
本文转自http://www.cnblogs.com/fangjian0423/p/springMVC-interceptor.html 感谢作者 目录 前言 重要接口及类介绍 源码分析 拦截器的配置 ...
随机推荐
- 【Java面试指北】反射(1) 初识反射
如果你被问到:什么是反射?为什么需要反射.以及反射的应用?你会如何回答呢? 本篇会带大家初识反射,了解反射概念和基本应用.反射的原理以及深入源码的探究将会在后面几篇介绍. 一.什么是反射? 要理解什么 ...
- 直播报名|资深云原生架构师分享服务网格在腾讯 IT 业务的落地实践
云原生在近几年的发展越来越火热,作为云上最佳实践而生的设计理念,也有了越来越多的实践案例,而一个个云原生案例的背后,是无声的巨大变革. 腾讯云主办首个云原生百科知识直播节目--<云原生正发声&g ...
- vue-cli3打包时vue-cli-service build怎么分不同环境(npm run build:stage和npm run build:prod)
- input限制只能输入汉字
<el-form class="det_foot" :model="form" :rules="rules" ref="fo ...
- 将git仓库从submodule转换为subtree
三个脚本 Alexander Mikhailian cat .gitmodules |while read i do if [[ $i == \[submodule* ]]; then mpath=$ ...
- 何为GUI???
1.GUI是什么–简介 GUI的全称为Graphical User Interface,图形化界面或图形用户接口,是指采用图形方式显示的计算机操作环境用户接口.与早期计算机使用的命令行界面相比,图形界 ...
- Raft一致性共识算法论文学习
论文地址:https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf 看完raft共识算法,脑袋非常懵,所以写一篇学习笔记,记录一下. raft ...
- Java进阶篇——设计模式
设计模式 一.代理模式 使用代理类对真实对象进行代理,包括真实对象方法的调用.功能的扩展等.访问的时候也只能访问到代理对象,既保护了真实对象同时可以在原始对象上进行扩展.类似于中介在卖家和买家之间的角 ...
- [深度探索C++对象模型]memcpy和memset注意事项
不管使用memcpy()还是memset(),都只有在"classes不含任何由编译器产生的内部members"时才能运行.如果这个类声明一个或者一个以上的virtual func ...
- ansible离线安装k8s v1.25版本
Kubernetes v1.25 企业级高可用集群自动部署(离线版) 注:确保所有节点系统时间一致 操作系统要求:CentOS7.x_x64 1.找一台服务器安装Ansible # yum insta ...

