《通用源码阅读指导书》前言

标签: 技术成长

保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/73/ )。

有一段时间,我觉着我非要阅读开源项目的源码不可。

那时,我已经在公司负责设计和开发了许多系统。如果连大学时带领大家开发和维护学校网站也算上的话,我已经进行软件开发整整十个年头了。在这十个年头里,我对自己设计和开发的系统都很有信心。但却有一个疑惑一直在我心头萦绕:我不知道,我的架构和世界最优良架构之间的差距到底有多大。

阅读开源项目的源码能给我答案。

许多优秀的开源项目历经数千开发者的数万次提交,被数亿用户使用。这些项目从可扩展性、可靠性、可用性等各个角度考量,都是十分优良的。通过阅读这些项目的源码能让我找到自己在软件设计和开发上的不足。

于是我开始了我的源码阅读计划。

在阅读源码的过程中,我看过不少资料。但很多资料对于源码中简单的部分讲解的细致入微;而对复杂的部分则避而不谈或含糊其辞。 在阅读源码的过程中,我也走过了不少弯路。经常在一个难点中挣扎很久不得前进。

当然,阅读源码也让我收获颇丰。它不仅让我知道了自己的设计与优良设计之间的差距,还让我学到了许多的架构技巧、编程知识。在源码阅读的过程我也总结出了许多的经验和方法。因此,我决定写这本书,将这些经验和方法分享出来,指引许多和我一样前行在源码阅读道路上的人。

源码阅读首先要选定相应的源码作为材料。从项目的成熟度、涉及面、应用广度、项目规模等多方面考虑,本书最终选中MyBatis的源码。因此,本书将以阅读MyBatis源码为例,介绍源码阅读的经验和方法。

在本书的写作中,我努力做到详尽而不罗嗦。本书以包为单位,对MyBatis源码中的300多个类都进行了介绍。在这个过程中,对于简单或重复的类一笔带过,但对于越复杂的类则越是逐方法、逐行地分析。力求让大家读的顺、读的懂、有收获。


本书一共分为了五个模块,每个模块的主要内容如下。

背景介绍模块:

第1章介绍了源码阅读的意义和方法。

第2章对MyBatis的背景和快速上手方法进行了介绍。这一章的内容是简单但重要的。对于任何一个软件,其背景对应于软件的“设计需求”,其使用对应于软件的“主要功能”。把握了一个软件设计需求和主要功能对于阅读软件的源码很有帮助。

第3章中使用断点调试方法对MyBatis的执行过程进行了追踪。该章节的内容有助于我们了解整个MyBatis的内部框架。

第4章对MyBatis的源码结构进行了介绍,并根据源码包的功能对包进行了分类。

基础功能包源码阅读模块:

在这一模块中,我们对5个基础功能包中的源码进行了阅读。基础功能包相对独立,与MyBatis的核心逻辑耦合小,比较适合作为我们源码阅读的切入点。在阅读这些源码时,我们也会逐步介绍一些阅读源码时常用的方法技巧。

第5章介绍了exceptions包的源码。我们可以通过该包了解MyBatis的整个异常体系。

第6章介绍了reflection包的源码。该包基于反射提供了创建对象、修改对象属性、调用对象方法等功能。这些功能在MyBatis的参数处理、结果处理等环节都发挥了重要的作用。

第7章介绍了annotations包与lang包的源码。这两个包中全是注解类。我们将通过对Java注解的学习详细了解每个注解类的含义。最后,我们还通过源码分析了注解类如何在MyBatis的运行中发挥作用。

第8章介绍了type包的源码。通过这一章我们将了解MyBatis如何组织和实现类型处理器,以完成对各种类型数据的处理。

第9章介绍了io包的源码。通过该包我们将了解到MyBatis如何完成外部类的筛选和载入。

第10章介绍了logging包的源码。logging包不仅为MyBatis提供了日志记录功能,还提供了获取和记录JDBC中日志的功能。通过这一章节,我们将了解这些功能的实现细节。

第11章介绍了parsing包的源码。通过这一章,我们将了解MyBatis如何完成XML文件的解析。

配置解析包源码阅读模块:

第12章介绍了配置解析相关类的分类方法。对于配置解析类相关的类可以按照类的功能将其划分为解析器类或解析实体类。

第13章介绍了binding包的源码。该包负责将SQL语句接入到映射接口中。

第14章介绍了builder包的源码。该包中的建造者基类和工具类为MyBatis基于建造者模式建造对象提供了基础。此外,该包还完成了映射文件和映射注解的解析工作。

第15章介绍了mapping包的源码。该包完成了SQL语句的处理、输入参数的处理、输出结果的处理等功能,并为MyBatis提供了多数据库支持的能力。

第16章介绍了scripting包的源码。就是在这个包中,复杂的SQL节点被逐步解析为纯粹的SQL语句。该章节将带我们详细了解这一解析过程。

第17章介绍了datasource包的源码。该包包含了MyBatis中与数据源相关的类,包括非池化数据源、池化数据源、数据源工厂等。也正是通过该包,MyBatis完成了和数据库的对接。

核心操作包源码阅读模块:

在这一模块中,我们将详细介绍MyBatis的核心操作包。

第18章介绍jdbc包的源码。该包仅使用6个类便为MyBatis提供了运行SQL语句和脚本的能力。

第19章介绍了cache包的源码。该包向我们展示了MyBatis如何使用装饰器模式为用户提供丰富的、可配置的缓存。并且该章节还从功能维度出发详细介绍了MyBatis的两级缓存机制。

第20章介绍了transaction包的源码。该包为MyBatis提供了内部和外部的事务支持。

第21章介绍了cursor包的源码。通过该包,MyBatis能将查询结果封装为游标形式返回。

第22章介绍了executor包的源码。executor包是MyBatis中最为重要也是最复杂的包。在这一章中,我们以子包为单位分别介绍了MyBatis的主键自增功能、懒加载功能、语句处理功能、参数处理功能、结果处理功能、结果集处理功能。然后在此基础上对MyBatis中执行器的源码进行了阅读。最后,我们阅读了MyBatis中错误上下文的源码,了解MyBatis如何及时地保留错误发生时的现场环境。

第23章介绍了session包的源码。session包是一个对外接口包,是用户在使用MyBatis时接触最多的包。

第24章介绍了plugin包的源码。在该章节中我们编写了一个插件,然后通过源码详细了解了MyBatis插件的实现原理以及MyBatis插件平台的架构。

总结与展望模块:

第25章对阅读MyBatis源码过程中的技巧方法进行了总结。

第26章从项目的成熟度、涉及面、应用广度、规模等角度综合考量为大家推荐了一些优秀的开源项目。学习完本书后,大家可以从这些项目中挑选一些进行源码阅读。


源码阅读毕竟是一个对知识广度和深度都有较高要求的工作。为了大家能够顺利地阅读MyBatis的源码,我们会在很多章节之前介绍该章节源码涉及的基础知识。先掌握这些基础知识后再阅读相关源码则会轻松很多。

受篇幅所限,书中只能给出部分MyBatis源码。我们将完整的带中文注释的MyBatis源码整理成了开源项目供大家下载、参考。该项目的地址为:https://github.com/yeecode/MyBatisCN

为了大家能更轻松地理解和掌握一些相对复杂的知识点,我们还准备了许多示例项目。该示例项目也开源供大家下载,地址为:https://github.com/yeecode/MyBatisDemo

受限于我的水平和时间,书中难免会有疏漏之处。您可以通过我的个人主页与我取得联系并与我交流。在那里也能看到我的最新项目。我的个人主页地址是:http://yeecode.top

通过阅读本书,您将详细了解MyBatis中每一个类的结构、原理、细节。但要注意,这只是我们阅读本书的额外收获。掌握源码阅读的方法和技巧,并将这些方法技巧应用到其他项目的源码阅读工作、系统设计工作、软件开发工作中,这才是阅读本书的最终目的。

源码阅读是一个过程艰苦而结果可观的工作。每一个潜心阅读源码的开发者都值的尊敬,也希望本书能够在您源码阅读的过程中为您提供一些帮助,让您多一些收获。

加油!奋斗路上的你和我。

本文首发于个人知乎:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。

作者书籍推荐