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的原因如下:
- 前公司用的SpringBoot1.3.2+Spring4.2.4+JDK8,现在公司用的是Spring4.0.2+JDK7,基于对工作帮助比较大我选择了稳定版Spring4.3.7去阅读。Spring5引用了大量特性,社区资料较少,且Spring5框架基于JDK8,就是说,大量特性我无法使用,如果有时间,以后我会阅读Spring5.x。
- Spring4.3.7功能完备,是个开源宝库,虽然版本不是最新,但是足以领略SpringMVC的所有风采。
- 这位博主的博客对我影响很大,推测他在大四的时候写出此文,后生佩服!他阅读的是Spring4.0.2源码,我搜索了下互联网,Spring4.3.7目前没有人去阅读并总结,所以我决定填补这片空白,Spring4.3.7相比Spring4.0.2引入了诸多新特性,如核心容器、数据访问和缓存等的改进。
- 本博客特点是由果到因,根据官方文档的提示,先从表象分析,从外向里,通过断点调试,找到源头所在。总结部分再在从里向外梳理,理清逻辑。我觉得这样更符合人的思考方式。我建议读者多打断点调试,学而不思则罔。
2.正文
2.1 文章推荐阅读顺序
有SpringMVC基础的可以直接忽略不看。小白可以看看,该文不仅介绍了简单的SpringMVC demo如何搭建,也交代了阅读源码的技巧
这个SpringMVC demo是一个增删改查demo,持久层使用Hibernate,配置力图最简。读者别看它是个简单的demo,麻雀虽小,五脏俱全,后续文章的内容都是基于该demo分析
SpringMVC源码阅读:核心分发器DispatcherServlet
解读SpringMVC的核心类,SpringMVC所有的逻辑都离不开它
解读SpringMVC如何找到我们定义的Controller和Controller中的方法,比如路径是如何映射的,弄清楚Controller是如何匹配我们传入的参数,并定义简单的参数解析器
解读Controller方法中的参数解析和参数解析类
解读SpringMVC的Json和Xml的转换原理
解读SpringMVC数据绑定机制和属性编辑器,介绍BeanWrapper,并自定义属性编辑器
解读SpringMVC拦截器的工作原理并自定义拦截器
解读SpringMVC过滤器的工作原理,并自定义过滤器,让你弄清楚过滤器和拦截器的区别
即使前后端分离大行其道,视图解析器作为Spring源码的一部分,我们还是要研读。该文解读SpringMVC如何完成视图解析,提供Freemarker和Jsp的共存方案
解读SpringMVC如何完成异常解析、捕捉异常,并自定义异常和异常解析器
2.2 SpringMVC流程图
博主根据打断点调试画得流程图,用Xmind画图