SpringMVC源码阅读系列汇总

Easter79
• 阅读 777

1.前言

1.1 导入

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

SpringMVC源码阅读系列汇总

本文基于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画图

SpringMVC源码阅读系列汇总

3.参考

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k