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君 先做了一个草图,完成了个mini版的 MVC。接下来看看 A君 会有什么骚操作吧
尝试动手写IOC容器
出场人物:A君(苦逼的开发)、老大(项目经理)
背景:老大 要求 A君在一周内开发个简单的 IOC容器
前情提要: A君 先做了一个草图,完成了个mini版的 MVC 。。。
第三十一版 映射器
“嗯。大体逻辑是这么个意思,但是这个太粗糙了,而且,每次请求都要创建一个新对象,这个相当的离谱。之后你打算怎么优化?” 办公室内,老大 看着 A君 提交上来的代码缓缓说道
来了,考验来。A君 心道。简单思索了下。开口道:“首先得先对映射处理进行,这个提取成接口。”
“只是如此吗?还有别的吗?” 老大 继续追问
“没、没、没了。” A君 结结巴巴、冷汗直冒,这感觉,像极了面试时,被面试官问的一句也答不上来的样子
“你要知道,首先匹配方式可以有多种。一个请求,可以携带太多信息了,诸如:请求头、参数、请求方法等,URL只是其中的一种。其次匹配方式也有多种:正则、通配符、完全匹配等。不过,其他内容先往后放放,你先做个URL完全匹配的就行了,记得还是那个原则:接口、抽象类、具体实现。你先去做一版看看。” 老大 说罢,挥了挥手,示意 A君 先去干活
请求条件
回到工位后,A君 开始思考,要如何实现才能符合 老大 的要求:定义接口,这自然是不用多说,可是接口需要依赖哪些信息呢?要是随便定个简单的接口,会被砍死的。这次可不能糊弄事了。首先是匹配方式,既然有多种,那就定义个接口吧。A君 定义RequestCondition
接口,代码如下:
/**
* 请求条件接口
*
* @param <T>
*/
public interface RequestCondition<T> {
/**
* 组合多种条件
*
* @param other
* @return
*/
T combine(T other);
/**
* 是否符合条件
*
* @param request
* @return
*/
T getMatchingCondition(HttpServletRequest request);
/**
* 比较优先级
*
* @param other
* @param request
* @return
*/
int compareTo(T other, HttpServletRequest request);
}
接着,就该轮到抽象类,这玩意能有什么共同点,A君 一阵愣神。“麻蛋,总得有个集合吧,不管是参数、方法还是URL。” 想了良久,不知道脑细胞死了多少个,不经一顿咒骂。A君 新增 AbstractRequestCondition
类,提取公共实现。代码如下:
public abstract class AbstractRequestCondition<T extends AbstractRequestCondition<T>> implements RequestCondition<T> {
public boolean isEmpty() {
return getContent().isEmpty();
}
protected abstract Collection<?> getContent();
}
抽象类也有了,接下来就是具体实现了,按照 老大 的要求,先实现请求方法、URL匹配。不用说,那肯定是先实现请求方法匹配。嘿嘿,原因无他,就是好欺负,请求方法个数是固定的。不过,除了熟知的GET
、POST
之外,还有几个请求方法。HT