实现Controller的三种方式分析

每种实现的方式对应的HanderAdapter都不同。

实现Controller接口

该接口对应的HanderAdapterSimpleControllerHandlerAdapter

使用案列:

 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接口

该接口对应的HanderAdapterHttpRequestHandlerAdapter

使用案例:

 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,然后再执行HttpRequestHanderAdapterhandleRequest方法。(实际就是去执行我们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基础源码分析(一)的更多相关文章

  1. SpringBoot中Tomcat和SpringMVC整合源码分析

    概述 ​ SpringBoot中集成官方的第三方组件是通过在POM文件中添加组件的starter的Maven依赖来完成的.添加相关的Maven依赖之后,会引入具体的jar包,在SpringBoot启动 ...

  2. SpringMVC源码分析系列

    说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...

  3. Spring源码分析专题——目录

    Spring源码分析专题 -- 阅读指引 IOC容器 Spring源码分析专题 -- IOC容器启动过程(上篇) Spring源码分析专题 -- IOC容器启动过程(中篇) Spring源码分析专题 ...

  4. SpringMVC拦截器详解[附带源码分析]

    目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...

  5. SpringMVC视图机制详解[附带源码分析]

    目录 前言 重要接口和类介绍 源码分析 编码自定义的ViewResolver 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门bl ...

  6. 详解SpringMVC请求的时候是如何找到正确的Controller[附带源码分析]

    目录 前言 源码分析 重要接口介绍 SpringMVC初始化的时候做了什么 HandlerExecutionChain的获取 实例 资源文件映射 总结 参考资料 前言 SpringMVC是目前主流的W ...

  7. SpringMVC类型转换、数据绑定详解[附带源码分析]

    目录 前言 属性编辑器介绍 重要接口和类介绍 部分类和接口测试 源码分析 编写自定义的属性编辑器 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那 ...

  8. [转]SpringMVC拦截器详解[附带源码分析]

      目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...

  9. springMVC容器加载源码分析

    springmvc是一个基于servlet容器的轻量灵活的mvc框架,在它整个请求过程中,为了能够灵活定制各种需求,所以提供了一系列的组件完成整个请求的映射,响应等等处理.这里我们来分析下spring ...

  10. SpringMVC拦截器详解[附带源码分析](转)

    本文转自http://www.cnblogs.com/fangjian0423/p/springMVC-interceptor.html 感谢作者 目录 前言 重要接口及类介绍 源码分析 拦截器的配置 ...

随机推荐

  1. Day34.2:Calendar详解

    Calendar 1.1 概述 Date类中很多方法被Calendar所取代,Calendar类提供了获取和设置各种日历的方法. 1.2 方法 构造方法:Calendar类的构造器被protected ...

  2. Nmap常用方法

    1.扫描单个目标地址  在Nmap后面直接添加目标地址即可扫描  nmap 目标地址  2.扫描多个目标地址  如果目标不在同一网段,或在同一网段但不连续且数量不多,可以使用该方法进行扫描  nmap ...

  3. 【Java面试指北】反射(1) 初识反射

    如果你被问到:什么是反射?为什么需要反射.以及反射的应用?你会如何回答呢? 本篇会带大家初识反射,了解反射概念和基本应用.反射的原理以及深入源码的探究将会在后面几篇介绍. 一.什么是反射? 要理解什么 ...

  4. npm Error: Cannot find module 'are-we-there-yet'

    npm 损坏了,are-we-there-yet是npm所依赖的npmlog依赖的一个包,重新安装npm即可 踩坑,直接安装还是报错,不管执行哪个命令都是报下面这个错 网上百度了很多,有的说把node ...

  5. [R语言] WGCNA入门教程

    文章目录 wgcna入门-雌性小鼠肝脏表达数据的网络分析:寻找与体重有关的模块 1 数据输入和清洗 1.1 加载基因表达数据 1.2 数据清洗 1.3 加载临床特征数据 2 建设表达网络与模块检测 2 ...

  6. Java基于内存的消息队列实现

    Java基于内存的消息队列实现 有需要源码的同学可以去Gitee上下载: https://gitee.com/hyxl-520/memory_message_queue 先看测试情况 需求背景 需求来 ...

  7. Hadoop详解(08) - Hadoop企业优化方案.docx

    Hadoop详解(08) - Hadoop企业优化方案.docx MapReduce优化 MapReduce 跑的慢的原因 计算机性能:CPU.内存.磁盘健康.网络 I/O 操作优化 (1)数据倾斜 ...

  8. 蚂蚁感冒【第五届蓝桥杯省赛C++A/B组】

    蚂蚁感冒 长 \(100\) 厘米的细长直杆子上有 \(n\) 只蚂蚁. 它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是 1 厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方 ...

  9. ING国际银行基于Volcano的大数据分析平台应用实践

    摘要:ING集团发表了<Efficient Scheduling Of High Performance Batch Computing For Analytics Workloads With ...

  10. doc指令

    ## 打开doc指令方法 1. 开始菜单 --所有应用--Windows系统--命令提示符 2. win+r 输入cmd 3. 桌面文件夹下面按住shift+右键选择在此处打开窗口 4. 文件导航栏路 ...