新書推薦:
《
詹姆斯·伍德系列:不负责任的自我:论笑与小说(“美国图书评论奖”入围作品 当代重要文学批评家詹姆斯·伍德对“文学中的笑与喜剧”的精湛研究)
》
售價:HK$
87.4
《
武当内家散手
》
售價:HK$
50.4
《
诛吕:“诸吕之乱”的真相与吕太后时期的权力结构
》
售價:HK$
99.7
《
炙野(全2册)
》
售價:HK$
78.2
《
女人的胜利
》
售價:HK$
55.9
《
数据有道:数据分析+图论与网络+微课+Python编程(鸢尾花数学大系:从加减乘除到机器学习)
》
售價:HK$
266.6
《
500万次倾听:陪伤心的人聊聊
》
售價:HK$
53.8
《
英国商业500年(见证大国崛起与企业兴衰,启迪未来商业智慧。)
》
售價:HK$
80.6
|
內容簡介: |
本书以开源软件MyBatis的源码为例,讲述程序源码阅读的流程、方法、技巧。本书先介绍MyBatis的发展背景与使用方法让读者对MyBatis建立概括性的认识,继而逐步深入剖析MyBatis的源码。并在剖析MyBatis源码的过程讲述源码中所涉及到的编程语言知识、设计模式、架构技巧。最终使得读者在详细了解MyBatis源码的同时掌握源码阅读的基本能力。
|
關於作者: |
易哥,毕业于浙江大学、山东大学,高级软件系统架构师、网络工程师、数据库工程师、软件测试工程师、注册电气工程师。在校成绩前1%,获得国家奖学金两次,一等奖学金四次,科技创新大赛一等奖三次,以及五四青年科学奖等。主要科研方向为机器学习、分布式算法、容错算法在无线传感网络中的应用,相关论文获得IEEE通信协会最佳论文奖。曾担任网站技术部门负责人,具有丰富的互联网开发经验。先后设计和实现了众多系统和平台,也是活跃的开源开发者。现专注软件系统架构设计与后端开发,著有书籍《通用源码阅读指导书》《高性能架构之道》等。
|
目錄:
|
第1篇 背景介绍
第1章 源码阅读 2
1.1 源码阅读的意义 2
1.2 源码阅读的方法 2
1.3 开源软件 3
1.4 MyBatis源码 4
1.5 本书结构 5
1.5.1 背景知识 5
1.5.2 文件的指代 5
1.5.3 方法的指代 8
第2章 MyBatis概述 10
2.1 背景介绍 10
2.1.1 传统数据库连接 10
2.1.2 ORM框架 11
2.1.3 MyBatis的特点 12
2.2 快速上手 12
2.2.1 MyBatis包的引入 14
2.2.2 MyBatis的简单配置 15
2.2.3 基于MyBatis的数据库操作 16
2.3 MyBatis的核心功能分析 17
第3章 MyBatis运行初探 20
3.1 初始化阶段追踪 23
3.1.1 静态代码块的执行 23
3.1.2 获取InputStream 24
3.1.3 配置信息读取 25
3.1.4 总结 27
3.2 数据读写阶段追踪 27
3.2.1 获得SqlSession 27
3.2.2 映射接口文件与映射文件的绑定 28
3.2.3 映射接口的代理 28
3.2.4 SQL语句的查找 31
3.2.5 查询结果缓存 31
3.2.6 数据库查询 33
3.2.7 处理结果集 36
3.2.8 总结 39
第4章 MyBatis源码结构概述 40
4.1 包结构 40
4.2 分组结构 40
第2篇 基础功能包源码阅读
第5章 exceptions包 44
5.1 背景知识 44
5.1.1 Java的异常 44
5.1.2 序列化与反序列化 45
5.2 Exception类 46
5.3 ExceptionFactory类 47
第6章 reflection包 48
6.1 背景知识 48
6.1.1 装饰器模式 48
6.1.2 反射 50
6.1.3 Type接口及其子类 54
6.2 对象工厂子包 55
6.3 执行器子包 57
6.4 属性子包 59
6.5 对象包装器子包 61
6.6 反射核心类 62
6.7 反射包装类 65
6.8 异常拆包工具 65
6.9 参数名解析器 68
6.10 泛型解析器 69
第7章 annotations包与lang包 76
7.1 Java注解详解 76
7.2 Param注解分析 78
第8章 type包 81
8.1 模板模式 82
8.2 类型处理器 83
8.2.1 类型处理器的基类与实现类 83
8.2.2 TypeReference类 85
8.3 类型注册表 86
第9章 io包 89
9.1 背景知识 89
9.1.1 单例模式 89
9.1.2 代理模式 89
9.1.3 静态代理 90
9.1.4 VFS 92
9.2 VFS实现类 92
9.2.1 DefaultVFS类 94
9.2.2 JBoss6VFS类 94
9.3 类文件的加载 96
9.4 ResolverUtil类 97
第10章 logging包 100
10.1 背景知识 100
10.1.1 适配器模式 100
10.1.2 日志框架与日志级别 102
10.1.3 基于反射的动态代理 103
10.2 Log接口 105
10.3 Log接口的实现类 107
10.4 LogFactory 108
10.5 JDBC日志打印 109
第11章 parsing包 113
11.1 背景知识 113
11.1.1 XML文件 113
11.1.2 XPath 115
11.2 XML解析 116
11.3 文档解析中的变量替换 118
第3篇 配置解析包源码阅读
第12章 配置解析概述 124
第13章 binding包 128
13.1 数据库操作的接入 128
13.1.1 数据库操作的方法化 129
13.1.2 数据库操作方法的接入 133
13.2 抽象方法与数据库操作节点的关联 134
13.3 数据库操作接入总结 136
13.3.1 初始化阶段 136
13.3.2 数据读写阶段 137
13.4 MyBatis与Spring、Spring Boot的整合 137
第14章 builder包 139
14.1 建造者模式 139
14.2 建造者基类与工具类 142
14.3 SqlSourceBuilder类与StaticSqlSource类 143
14.4 CacheRefResolver类和ResultMapResolver类 145
14.4.1 CacheRefResolver类 145
14.4.2 ResultMapResolver类 146
14.5 ParameterExpression类 148
14.6 XML文件解析 149
14.6.1 XML文件的声明解析 150
14.6.2 配置文件解析 151
14.6.3 数据库操作语句解析 153
14.6.4 Statement解析 155
14.6.5 引用解析 157
14.7 注解映射的解析 159
14.7.1 注解映射的使用 159
14.7.2 注解映射解析的触发 160
14.7.3 直接注解映射的解析 164
14.7.4 间接注解映射的解析 164
第15章 mapping包 169
15.1 SQL语句处理功能 169
15.1.1 MappedStatement类 169
15.1.2 SqlSource类 170
15.1.3 BoundSql 171
15.2 输出结果处理功能 171
15.2.1 ResultMap类 172
15.2.2 ResultMapping类 173
15.2.3 Discriminator 174
15.3 输入参数处理功能 176
15.4 多数据库种类处理功能 176
15.5 其他功能 178
第16章 scripting包 179
16.1 OGNL 179
16.2 语言驱动接口及语言驱动注册表 183
16.3 SQL节点树的组建 186
16.4 SQL节点树的解析 189
16.4.1 OGNL辅助类 189
16.4.2 表达式求值器 193
16.4.3 动态上下文 194
16.4.4 SQL节点及其解析 196
16.5 再论SqlSource 202
16.5.1 SqlSource的生成 202
16.5.2 DynamicSqlSource的转化 205
16.5.3 RawSqlSource的转化 206
16.5.4 SqlSource接口的实现类总结 207
第17章 datasource包 208
17.1 背景知识 208
17.1.1 java.sql包和javax.sql包 208
17.1.2 DriverManager 209
17.1.3 DataSource 209
17.1.4 Connection 210
17.1.5 Statement 211
17.2 数据源工厂接口 211
17.3 JNDI数据源工厂 213
17.4 非池化数据源及工厂 214
17.4.1 非池化数据源工厂 214
17.4.2 非池化数据源 216
17.5 池化数据源 218
17.5.1 池化数据源类的属性 218
17.5.2 池化连接的给出与收回 220
17.5.3 池化连接 228
17.6 论数据源工厂 229
第4篇 核心操作包源码阅读
第18章 jdbc包 232
18.1 AbstractSQL类与SQL类 232
18.1.1 SafeAppendable内部类 232
18.1.2 SQLStatement内部类 233
18.1.3 AbstractSQL类 235
18.1.4 SQL类 236
18.2 SqlRunner类 237
18.3 ScriptRunner类 240
18.4 jdbc包的独立性 241
第19章 cache包 243
19.1 背景知识 243
19.1.1 Java对象的引用级别 243
19.1.2 ReferenceQueue类 244
19.2 cache包结构与Cache接口 247
19.3 缓存键 248
19.3.1 缓存键的原理 248
19.3.2 缓存键的生成 251
19.4 缓存的实现类 252
19.5 缓存装饰器 252
19.5.1 同步装饰器 253
19.5.2 日志装饰器 253
19.5.3 清理装饰器 254
19.5.4 阻塞装饰器 259
19.5.5 定时清理装饰器 262
19.5.6 序列化装饰器 263
19.6 缓存的组建 264
19.7 事务缓存 267
19.8 MyBatis缓存机制 271
19.8.1 一级缓存 271
19.8.2 二级缓存 274
19.8.3 两级缓存机制 277
第20章 transaction包 279
20.1 事务概述 279
20.2 事务接口及工厂 280
20.3 JDBC事务 282
20.4 容器事务 283
第21章 cursor包 284
21.1 Iterable接口与Iterator接口 284
21.2 MyBatis中游标的使用 285
21.3 游标接口 285
21.4 默认游标 286
21.4.1 CursorStatus内部类 287
21.4.2 ObjectWrapperResultHandler内部类 287
21.4.3 CursorIterator内部类 288
21.4.4 DefaultCursor外部类 289
第22章 executor包 293
22.1 背景知识 293
22.1.1 基于cglib的动态代理 293
22.1.2 javassist框架的使用 295
22.1.3 序列化与反序列化中的方法 296
22.1.4 ThreadLocal 302
22.1.5 存储过程 305
22.1.6 Statement及其子接口 306
22.2 主键自增功能 308
22.2.1 主键自增的配置与生效 308
22.2.2 Jdbc3KeyGenerator类 310
22.2.3 SelectKeyGenerator类 312
22.3 懒加载功能 316
22.3.1 懒加载功能的使用 316
22.3.2 懒加载功能的实现 318
22.3.3 懒加载功能对序列化和反序列化的支持 325
22.4 语句处理功能 329
22.4.1 MyBatis对多语句类型的支持 329
22.4.2 MyBatis的语句处理功能 331
22.5 参数处理功能 333
22.6 结果处理功能 334
22.7 结果集处理功能 336
22.7.1 MyBatis中多结果集的处理 337
22.7.2 结果集封装类 340
22.7.3 结果集处理器 341
22.8 执行器 347
22.8.1 执行器接口 348
22.8.2 执行器基类与实现类 348
22.9 错误上下文 352
第23章 session包 355
23.1 SqlSession及其相关类 355
23.1.1 SqlSession的生成链 356
23.1.2 DefaultSqlSession类 357
23.1.3 SqlSessionManager类 358
23.2 Configuration类 361
23.3 其他类 364
第24章 plugin包 366
24.1 责任链模式 366
24.2 MyBatis插件开发 368
24.3 MyBatis拦截器平台 370
24.4 MyBatis拦截器链与拦截点 373
第5篇 总结与展望
第25章 源码阅读总结 378
25.1 前期准备 378
25.1.1 工具准备 378
25.1.2 项目选择 378
25.1.3 项目使用 379
25.2 项目初探 379
25.3 源码阅读 380
25.3.1 模块分析 380
25.3.2 模块归类 380
25.3.3 自底向上 380
25.3.4 合理猜测 381
25.3.5 类比阅读 381
25.3.6 善于汇总 381
25.3.7 网格阅读 382
第26章 优秀开源项目推荐 383
26.1 Guava 383
26.2 Tomcat 384
26.3 Redis 384
26.4 Dubbo 385
26.5 React 385
|
內容試閱:
|
有一段时间,我觉着我非要阅读开源项目的源码不可。
那时,我在公司负责设计和开发了很多系统。如果连大学时带领大家开发和维护学校网站也算上的话,那我进行软件开发已经整整十年了。在这十年里,我对自己设计和开发的系统都很有信心,但有一个疑惑一直萦绕在我心头:我不知道,我的架构和世界最优良架构之间的差距到底有多大。
阅读开源项目的源码能给我答案。
许多优秀的开源项目历经数千名开发者的数万次提交,被数亿用户使用。这些项目从可扩展性、可靠性和可用性等各个角度考量,都是十分优良的。通过阅读这些项目的源码,我能找到自己在软件设计和开发上的不足。
于是我开始了我的源码阅读计划。
在阅读源码的过程中,我看过不少资料。但很多资料对源码中简单的部分讲解得细致入微,而对复杂的部分则避而不谈或含糊其辞。在阅读源码的过程中,我也走过不少弯路,经常在一个难点中挣扎很久不能前进。
当然,阅读源码也让我收获颇丰。它不仅让我知道了自己的设计与优良设计之间的差距,还让我学到了许多架构技巧和编程知识。在源码阅读的过程中,我也总结出了许多经验和方法。因此,我决定写这本书,将经验和方法分享出来,指引许多和我一样前行在源码阅读道路上的人。
源码阅读首先要选定相应的源码作为材料。从项目的成熟度、涉及面、应用广度、项目规模等多方面考虑,本书最终选中MyBatis源码。因此,本书将以阅读MyBatis源码为例,介绍源码阅读的经验和方法。
在本书的写作中,我努力做到详尽而不啰唆。本书以包为单位,对MyBatis源码中的300多个类进行了介绍。在此过程中,对于简单或重复的类一笔带过,但对于复杂的类,则是逐方法、逐行地进行分析,力求让大家读得顺、读得懂、有收获。
本书分为五篇,各篇主要内容如下。
第1篇为背景介绍,包括第1~4章。
第1章介绍了源码阅读的意义和方法。
第2章对MyBatis的背景和快速上手方法进行了介绍。这一章的内容是简单但重要的。对于任何一个软件,其背景对应于软件的设计需求,其使用对应于软件的主要功能。把握一个软件的设计需求和主要功能对于阅读软件的源码很有帮助。
第3章中使用断点调试方法对MyBatis的执行过程进行了追踪。该章内容有助于我们了解整个MyBatis的内部框架。
第4章对MyBatis源码结构进行了介绍,并根据源码包的功能对包进行了分类。
第2篇为基础功能包源码阅读,包括第5~11章。
在这一篇中,我们对基础功能包中的源码进行了阅读。基础功能包相对独立,与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文件的解析。
第3篇为配置解析包源码阅读,包括第12~17章。
第12章介绍了配置解析相关类的分类方法。配置解析相关类可以按照类的功能划分为解析器类和解析实体类。
第13章介绍了binding包的源码。该包负责将SQL语句接入映射接口。
第14章介绍了builder包的源码。该包中的建造者基类和工具类为MyBatis基于建造者模式建造对象提供了基础。此外,该包还完成了XML文件和注解映射的解析工作。
第15章介绍了mapping包的源码。该包完成了SQL语句的处理、输入参数的处理、输出结果的处理等功能,并为MyBatis提供了多数据库支持的能力。
第16章介绍了scripting包的源码。就是在这个包中,复杂的SQL节点被逐步解析为纯粹的SQL语句,该章将详细讲解这一解析过程。
第17章介绍了datasource包的源码。该包包含了MyBatis中与数据源相关的类,包括非池化数据源、池化数据源、数据源工厂等。也正是通过该包,MyBatis完成了和数据库的对接。
第4篇为核心操作包源码阅读,包括第18~24章。
在这一篇中,将详细介绍MyBatis的核心操作包。
第18章介绍了jdbc包的源码。该包仅使用六个类便为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插件平台的架构。
第5篇为总结与展望,包括第25、26章。
第25章对阅读MyBatis源码过程中的方法和技巧进行了总结。
第26章从项目的成熟度、涉及面、应用广度和规模等角度综合考量,为大家推荐了一些优秀的开源项目。学习完本书后,大家可以从这些项目中挑选一些进行源码阅读。
源码阅读毕竟是一个对知识广度和深度都有较高要求的工作,为了大家能够顺利地阅读MyBatis的源码,我们会在很多章节之前先介绍该章节源码涉及的基础知识。掌握这些基础知识后再阅读相关源码则会轻松很多。
受篇幅所限,书中只能给出部分MyBatis源码。我们将完整的带中文注释的MyBatis源码整理成了开源项目,供大家下载与参考。该项目的地址为:https:github.comyeecodeMyBatisCN。
为了让大家能更轻松地理解和掌握一些相对复杂的知识点,我们还准备了许多示例项目。下载地址为:https:github.comyeecodeMyBatisDemo。
由于时间和水平有限,书中难免会有疏漏之处。您可以通过我的个人主页与我取得联系并进行交流,在那里也能看到我的最新项目。我的个人主页地址为:http:yeecode.top。
通过阅读本书,您将详细了解MyBatis中每一个类的结构、原理和细节。但要注意,这只是我们阅读本书的额外收获。掌握源码阅读的方法和技巧,并将这些方法和技巧应用到其他项目的源码阅读工作、系统设计工作、软件开发工作中,这才是阅读本书的最终目的。
源码阅读是一项过程艰苦而结果可观的工作。每一个潜心阅读源码的开发者都值得尊敬,也希望本书能够在您阅读源码的过程中为您提供一些帮助,让您多一些收获。
加油!奋斗路上的你和我。
著 者
|
|