Spring源码阅读目录
第一部分——IOC篇
第一章 Spring之最熟悉的陌生人——IOC
第二章 Spring之假如让你来写IOC容器——加载资源篇
第三章 Spring之假如让你来写IOC容器——解析配置文件篇
第四章 Spring之假如让你来写IOC容器——XML配置文件篇
第五章 Spring之假如让你来写IOC容器——BeanFactory和FactoryBean
第六章 Spring之假如让你来写IOC容器——Scope和属性填充
第七章 Spring之假如让你来写IOC容器——属性填充特别篇:SpEL表达式
第八章 Spring之假如让你来写IOC容器——拓展篇
第九章 Spring之源码阅读——环境搭建篇
第十章 Spring之源码阅读——IOC篇
第二部分——AOP篇
第十一章 Spring之不太熟的熟人——AOP
第十二章 Spring之不得不了解的内容——概念篇
第十三章 Spring之假如让你来写AOP——AOP联盟篇
第十四章 Spring之假如让你来写AOP——雏形篇
第十五章 Spring之假如让你来写AOP——Joinpoint(连接点)篇
第十六章 Spring之假如让你来写AOP——Pointcut(切点)篇
第十七章 Spring之假如让你来写AOP——Advice(通知)上篇
第十八章 Spring之假如让你来写AOP——Advice(通知)下篇
第十九章 Spring之假如让你来写AOP——番外篇:Spring早期设计
第二十章 Spring之假如让你来写AOP——Aspect(切面)篇
第二十一章 Spring之假如让你来写AOP——Weaver(织入器)篇
第二十二章 Spring之假如让你来写AOP——Target Object(目标对象)篇
第二十三章 Spring之假如让你来写AOP——融入IOC容器篇
第二十四章 Spring之源码阅读——AOP篇
第三部分——事务篇
第二十五章 Spring之曾经的老朋友——事务
第二十六章 Spring之假如让你来写事务——初稿篇
第二十七章 Spring之假如让你来写事务——铁三角篇
第二十八章 Spring之假如让你来写事务——属性篇
第二十九章 Spring之假如让你来写事务——状态篇
第三十章 Spring之假如让你来写事务——管理篇
第三十一章 Spring之假如让你来写事务——融入IOC容器篇
第三十二章 Spring之源码阅读——事务篇
第四部分——MVC篇
第三十三章 Spring之梦开始的地方——MVC
第三十四章 Spring之假如让你来写MVC——草图篇
第三十五章 Spring之假如让你来写MVC——映射器篇
第三十六章 Spring之假如让你来写MVC——拦截器篇
第三十七章 Spring之假如让你来写MVC——控制器篇
第三十八章 Spring之假如让你来写MVC——适配器篇
第三十九章 Spring之假如让你来写MVC——番外篇:类型转换
第四十章 Spring之假如让你来写MVC——ModelAndView篇
第四十一章 Spring之假如让你来写MVC——番外篇:数据绑定
第四十二章 Spring之假如让你来写MVC——视图篇
第四十三章 Spring之假如让你来写MVC——上传文件篇
第四十四章 Spring之假如让你来写MVC——异常处理器篇
第四十五章 Spring之假如让你来写MVC——国际化篇
第四十六章 Spring之假如让你来写MVC——主题解析器篇
第四十七章 Spring之假如让你来写MVC——闪存管理器篇
第四十八章 Spring之假如让你来写MVC——请求映射视图篇
第四十九章 Spring之假如让你来写MVC——番外篇:属性操作
第五十章 Spring之假如让你来写MVC——融入IOC容器篇
第五十一章 Spring之源码阅读——MVC篇
第五部分——Boot篇
第五十二章 Spring之再进一步——Boot
第五十三章 Spring之假如让你来写Boot——环境篇
第五十四章 Spring之假如让你来写Boot——注解篇(上)
第五十五章 Spring之假如让你来写Boot——注解篇(下)
第五十六章 Spring之假如让你来写Boot——SPI篇
第五十七章 Spring之假如让你来写Boot——配置文件篇(上)
第五十八章 Spring之假如让你来写Boot——配置文件篇(下)
第五十九章 Spring之假如让你来写Boot——番外篇:再谈Bean定义
第六十章 Spring之假如让你来写Boot——自动装配篇
第六十一章 Spring之假如让你来写Boot——番外篇:杂谈Starter
第六十二章 Spring之假如让你来写Boot——番外篇:重构BeanFactory
第六十三章 Spring之假如让你来写Boot——番外篇:再谈ApplicationContext
第六十四章 Spring之假如让你来写Boot——内嵌Web容器篇
第六十五章 Spring之假如让你来写Boot——Main方法启动篇
第六十六章 Spring之最终章——结语篇
文章目录
前言
对于Spring一直都是既熟悉又陌生,说对它熟悉吧,平时用用没啥问题,但面试的时候被问的一脸懵逼,就很尴尬,都不好意思在简历上写着熟悉Spring了
所以决定花点时间研究研究Spring的源码。主要参考的书籍是:《Spring源码深度解析(第2版)》、《Spring揭秘》、《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》
书接上回,在上篇 第四十二章 Spring之假如让你来写MVC——视图篇 中,随着 视图篇 的完成,A君 算是完成了 MVC 的大部分的功能了。不过还有些组件需要进一步完成。接下来看看 A君 会有什么骚操作吧
尝试动手写IOC容器
出场人物:A君(苦逼的开发)、老大(项目经理)
背景:老大 要求 A君在一周内开发个简单的 IOC容器
前情提要:A君 已经完成了 视图 部分的功能了 。。。
第三十七版 上传文件
“干得不错!A君。现在 MVC 中的主要组件已经差不多完成了,不过还有一些补充的内容。 ” 老大 赞赏道
“额。除却这些东西还有什么组件需要补充的吗?” A君 问道
“还有几个小功能,今天先完成上传文件的部分吧。” 老大 说道
“上传文件?” A君 一愣,之前整的不亦乐乎,完全没考虑到这茬
“是的,上传文件有多常用就不用我都说了吧,相信你之前做Web开发的时候也有弄过,你可以参考对应的实现,这回还是你自己来发挥。” 老大 依旧笑眯眯的说道
“好吧。” A君 只能无奈答应,看这架势,老大 是有意在磨练他
文件信息
回到工位后,A君 仔细琢磨了下,发现所谓上传文件,无非就是I/O操作罢了,只是从磁盘变成了网络。要想上传一个文件,无法避免读和写,怎么读?这是客户端的事,对于服务器来说,就是request
的输入流,读多少?HTTP协议也有相应的长度请求头。那么,框架要做的事:就是如何根据这些内容,把他封装成一个文件对象,这样用户就不需要操作流了。
在实现功能之前,A君 已经习惯性先看官方文档,其次就是看看有没有第三方支持。如果有现成的API或者框架,就可以大大缩短开发时间,还可以提高效率。果不其然,Servlet3.0 中就有提到对应的API,如下:
既然官方都提供了对应API,那 A君 还客气啥,直接用就可以了。不过呢,为了方便使用,还是得对其稍微的封装一下。除了 Servlet3.0 自带的API上传,还可以使用第三方jar包,如:Apache Commons FileUpload。多个实现?不用想,直接定义个接口对文件信息进行封装。A君 新增MultipartFile
接口,代码如下:
/**
* 上传文件信息接口
*/
public interface MultipartFile extends InputStreamSource {
/**
* 获取文件名
*
* @return
*/
String getName();
/**
* 获取原始文件名
*
* @return
*/
String getOriginalFilename();
/**
* @return
*/
String getContentType();
/**
* 是否为空
*
* @return
*/
boolean isEmpty();
/**
* 获取文件大小
*
* @return
*/
long getSize();
/**
* 获取字节数组
*
* @return
* @throws IOException
*/
byte[] getBytes() throws IOException;
@Override
InputStream getInputStream() throws IOException;
default Resource getResource() {
return new MultipartFileResource(this);