1.前言

1.1 导入

SpringMVC是基于Servlet和Spring框架设计的Web框架,做JavaWeb的同学应该都知道

本文基于Spring4.3.7源码分析,(不要被图片欺骗了,手动滑稽),Spring官网告诉我们,Spring可以构建基于JVM的Servlet程序。Spring初代版本在2003年由Rod Johnson所写

以下摘自维基百科

The Spring Framework is an application framework and inversion of control container for the Java platform. The framework's core features can be used by any Java application, but there are extensions for building web applications on top of the Java EE (Enterprise Edition) platform. Although the framework does not impose any specific programming model, it has become popular in the Java community as an addition to, or even replacement for the Enterprise JavaBeans (EJB) model. The Spring Framework is open source.

1.2 版本历史

Version Date Notes
0.9 2002  
1.0 2003  
2.0 2006  
3.0 2009  
4.0 2013  
5.0 2017  

1.3 杂谈

2019年1月的某一天,我遇到了不能转换Json和Xml的情况,百度了很久,都说Jar包版本不对,照网上说得改不行呢,在StackOverflow尬聊也没有解决问题。后来我想到前公司的架构,发QQ问他,他半小时就给我解决方案,说把<mvc:annotation-driven/>启动,注释掉自己注入的Bean。或者手动注入MappingJackson2HttpMessageConverter和Jaxb2RootElementHttpMessageConverter。当时我听到这些是懵圈的,没有读过源码的我瑟瑟发抖,我问他怎么找到的,他发给我截图,讲在ReqeustMappingHandlerAdapter的afterPropertiesSet里发现了我的MessageConverters少了解析Xml和Json的核心类,顿时我恍然大悟,原来从源码层面调试发现问题根本原因的效率这么高。楼主想到自己看了些所谓的教学视频,学习着所谓的新技术,却不晓其理,甚是懊悔,从那时起,我决定开始读SpringMVC源码,第一篇文章在2019年1月22日完成,SpringMVC源码阅读系列持续更新,SpringMVC基本的模块已经阅读完毕,模块有需要补充的或者新模块可以评论告诉楼主。

Spring4.3在2016年1月10日发布,官方提供更新支持到2020年,它快走到了尽头,但是没关系,目前国内有大把的人再用Spring4,短期内不会过时,现在甚至还有人用Spring3呢。

我没有选择阅读Spring5的原因如下:

  1. 前公司用的SpringBoot1.3.2+Spring4.2.4+JDK8,现在公司用的是Spring4.0.2+JDK7,基于对工作帮助比较大我选择了稳定版Spring4.3.7去阅读。Spring5引用了大量特性,社区资料较少,且Spring5框架基于JDK8,就是说,大量特性我无法使用,如果有时间,以后我会阅读Spring5.x。
  2. Spring4.3.7功能完备,是个开源宝库,虽然版本不是最新,但是足以领略SpringMVC的所有风采。
  3. 这位博主的博客对我影响很大,推测他在大四的时候写出此文,后生佩服!他阅读的是Spring4.0.2源码,我搜索了下互联网,Spring4.3.7目前没有人去阅读并总结,所以我决定填补这片空白,Spring4.3.7相比Spring4.0.2引入了诸多新特性,如核心容器、数据访问和缓存等的改进。
  4. 本博客特点是由果到因,根据官方文档的提示,先从表象分析,从外向里,通过断点调试,找到源头所在。总结部分再在从里向外梳理,理清逻辑。我觉得这样更符合人的思考方式。我建议读者多打断点调试,学而不思则罔。

2.正文

2.1 文章推荐阅读顺序

SpringMVC源码阅读入门

有SpringMVC基础的可以直接忽略不看。小白可以看看,该文不仅介绍了简单的SpringMVC demo如何搭建,也交代了阅读源码的技巧

这个SpringMVC demo是一个增删改查demo,持久层使用Hibernate,配置力图最简。读者别看它是个简单的demo,麻雀虽小,五脏俱全,后续文章的内容都是基于该demo分析

SpringMVC源码阅读:核心分发器DispatcherServlet

解读SpringMVC的核心类,SpringMVC所有的逻辑都离不开它

SpringMVC源码阅读:定位Controller

解读SpringMVC如何找到我们定义的Controller和Controller中的方法,比如路径是如何映射的,弄清楚Controller是如何匹配我们传入的参数,并定义简单的参数解析器

SpringMVC源码阅读:Controller中参数解析

解读Controller方法中的参数解析和参数解析类

SpringMVC源码阅读:Json,Xml自动转换

解读SpringMVC的Json和Xml的转换原理

SpringMVC源码阅读:属性编辑器、数据绑定

解读SpringMVC数据绑定机制和属性编辑器,介绍BeanWrapper,并自定义属性编辑器

SpringMVC源码阅读:拦截器

解读SpringMVC拦截器的工作原理并自定义拦截器

SpringMVC源码阅读:过滤器

解读SpringMVC过滤器的工作原理,并自定义过滤器,让你弄清楚过滤器和拦截器的区别

SpringMVC源码阅读:视图解析器

即使前后端分离大行其道,视图解析器作为Spring源码的一部分,我们还是要研读。该文解读SpringMVC如何完成视图解析,提供Freemarker和Jsp的共存方案

SpringMVC源码阅读:异常解析器

解读SpringMVC如何完成异常解析、捕捉异常,并自定义异常和异常解析器

2.2 SpringMVC流程图

博主根据打断点调试画得流程图,用Xmind画图

3.参考

https://docs.spring.io/spring/docs/4.3.7.RELEASE/spring-framework-reference/htmlsingle/#beans-beans-conversion

SpringMVC源码阅读系列汇总的更多相关文章

  1. 源码阅读系列:EventBus

    title: 源码阅读系列:EventBus date: 2016-12-22 16:16:47 tags: 源码阅读 --- EventBus 是人们在日常开发中经常会用到的开源库,即使是不直接用的 ...

  2. Spring源码阅读系列总结

    最近一段时间,粗略的查看了一下Spring源码,对Spring的两大核心和Spring的组件有了更深入的了解.同时在学习Spring源码时,得了解一些设计模式,不然阅读源码还是有一定难度的,所以一些重 ...

  3. JDK1.8源码阅读系列之三:Vector

    本篇随笔主要描述的是我阅读 Vector 源码期间的对于 Vector 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 先来看一下 Vector 的继承图: 可以看出,Vector 的直 ...

  4. SpringMVC源码阅读:过滤器

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...

  5. SpringMVC源码阅读:属性编辑器、数据绑定

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...

  6. SpringMVC源码阅读:拦截器

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...

  7. 【合集】TiDB 源码阅读系列文章

    [合集]TiDB 源码阅读系列文章 (一)序 (二)初识 TiDB 源码 (三)SQL 的一生 (四)INSERT 语句概览 (五)TiDB SQL Parser 的实现 (六)Select 语句概览 ...

  8. SpringMVC源码阅读:核心分发器DispatcherServlet

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将介绍SpringMVC的核 ...

  9. SpringMVC源码阅读:定位Controller

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码分析,弄清楚Spr ...

随机推荐

  1. hdu 5071 vector操作恶心模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=5071 对于每一个窗口,有两个属性:优先级+说过的单词数,支持8个操作:新建窗口,关闭窗口并输出信息,聊天(置顶窗 ...

  2. yum改成网易的源

    用网易的源会快很多,步骤如下:http://mirrors.163.com/.help/centos.html 1.首先备份/etc/yum.repos.d/CentOS-Base.repo mv / ...

  3. 2.虚拟机安装的ubuntu全屏显示

    虚拟机下面安装了ubuntu系统,显示的屏幕只有那么一小块儿,不知道如何才能全屏,那么如何全屏呢?且看下面经验. 方法/步骤 打开虚拟机,并点击要更改成全屏的那个ubuntu系统的电源 我的虚拟机名字 ...

  4. Shell 命令实现词频统计

    杨贵福老师的方法 cat tr sed sort head 命令的综合使用方式1 $ cat pg11.txt |tr -cs A-Za-z\' '\n' |sed "/'/d"| ...

  5. 利用GDI+处理图像的色彩

    首先先介绍一下ColorMatrix结构体:表示颜色的变换关系,定义如下: typedef struct { REAL m[][]; } ColorMatrix; ColorMatrix结构体一般和I ...

  6. SSO集成方案[随笔]

    看这个方案之前,先说明下为什么要加入SSO,以防对大家产生不好的影响.我们产品使用传统winform+db服务+Db存储方式开发,一群老菜帮子开发,以传统的datatble做数据传递,很多年了未有变化 ...

  7. 剑指offer编程题Java实现——面试题7用两个栈实现队列

    题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; ...

  8. [POI2015]LOG(树状数组)

    今天考试考了这题,所以来贡献\([POI2015]LOG\)的第一篇题解.代码略丑,调了快三个小时才调出来\(AC\)代码. 对于这种小清新数据结构题,所以我觉得树状数组才是这道题的正确打开方式. 首 ...

  9. iOS,Android,WP, .NET通用AES加密算法

    这两天为移动App开发API,结果实现加密验证时碰到一大坑.这里不得不吐槽下又臭又硬的iOS,Windows Server无法解密出正确的结果,Android则可以,后来使用了通用的AES256加密算 ...

  10. 上台阶问题(递归,DFS)

    题目 一共39层台阶.如果我每一步迈上1个台阶或者两个台阶,先迈左脚,再迈右脚,然后左右交换,最后一步迈右脚,也就是一共要走偶数步,那么,上完39级台阶,有多少种不同的方法? 思路 采用递归的思想,边 ...