如何快速的理清开源项目的代码逻辑(一)
优采云 发布时间: 2021-07-09 04:25
如何快速的理清开源项目的代码逻辑(一)
创建和运营一个纯粹的小说出版平台网站,收入只来自付费阅读需要多少钱?
月影梧桐作者5.2日募资70万元,募资30万元启动网站。仅用了半天时间就达到了目标,效果超出预期。
网站10 将在 30 天内建成并投入使用。非常好,大家多多支持。他不同于看文章,版权属于作者。
如何高效阅读源代码?
以下是文章之前写的一篇文章:《如何快速阅读源码》
本文讨论当你需要了解一个开源项目时,如何快速理清一个开源项目的代码逻辑!
以下是我个人认为有效的方法:
本文以Mybatis为例进行演示!
先“跑”
编程界有一个古老的传统。在学习新技术时,我们总是从“Hello World”开始!学习新语言时是否打印“Hello World”;或者在学习一个新框架的时候写一个demo!那为什么这里的“跑起来”要加引号呢?
其实,当你想阅读一个开源项目的源代码时,大多数情况下,你已经可以使用这个开源项目了!所以这里的“跑起来”不是写一个“Hello World”,也不是可以跑起来的程序!相反,您可以__在脑海中“奔跑”__!什么意思?
你知道如何使用Mybatis吗?那么Mybatis是如何执行的呢?仔细想想,能不能用完整的句子描述一下?
这里是Mybatis文章官方介绍!你是怎么读到这个文章的?读一遍就够了吗?用文章 运行就足够了吗?你能从这个文章 得到多少信息?
让我们整理一下:
从 XML 构建 SqlSessionFactory 不使用 XML 从 SqlSessionFactory 构建 SqlSessionFactory 从 SqlSessionFactory 获取 SqlSession 探索映射的 SQL 语句的范围和生命周期
以上问题都有答案!你基本上可以在你的脑海中“运行”Mybatis!之后,你就可以真正开始阅读源代码了!
当你能够“运行”一个开源项目时,其实你对开源项目有了最初步的了解!就像“书籍索引”一样!根据这个指标,我们一步步拆解,细化下一层的结构和工艺。这期间可能需要深入技术细节,考虑实施,考虑是否有更好的实施方案!也就是说,接下来的三个步骤不是线性的,而是一个__不断交替执行__!最终形成一个完整的源码执行流程!
自顶向下拆解
继续通过Mybatis演示(限于篇幅,我只会演示一个大概的过程)!我们现在有了一个大致的流程:
虽然每个点都可以细化,但也是有优先级的!
显然,SqlSession执行sql是Mybatis的核心!先从这点说起吧!
首先当然要先下载Mybatis的源码(请自行下载)!
直接上SqlSession吧!一个接口,里面有一堆执行sql的方法!
这里只列出了一些方法:
SqlSession 通过这些方法执行sql!直接看我们Mybatis常用和推荐的用法,就是基于Mapper的执行!也就是说“SqlSession通过Mapper执行特定的sql”!上述过程细化为:
SqlSession 是如何获取 Mapper 的? Mapper如何执行SQL?
深入细节
我们来看看SqlSession的实现! SqlSession 有两个实现类SqlSessionManager 和DefaultSqlSession!这两个类的使用情况可以通过IDE的引用功能查看。你会发现SqlSessionManager实际上并没有被使用!而 DefaultSqlSession 是通过 DefaultSqlSessionFactory 构建的!那么让我们看看 DefaultSqlSession 是如何构建 Mapper 的!
直接委托给Configuration的getMapper方法!
配置已委托给 MapperRegistry 类的 getMapper 方法!
在 MapperRegistry 类的 getMapper 中:
这里的 knowMappers 是什么?什么是 MapperProxyFactory? mapperProxyFactory.newInstance(sqlSession) 具体是做什么的?
其实很简单,knowMappers就是一个Map,里面收录了类和对应的MapperProxyFactory的对应关系! MapperProxyFactory 通过 newInstance 构建对应的 Mapper(其实是 Mapper 的代理)!
接近真相,看mapperProxyFactory.newInstance(sqlSession)中的代码:
你在这里做什么?
最后其实是委托给sqlSession来执行具体的sql!请自行查看,了解稍后如何实施的详细信息!
扩展改进
现在我们的流程大致是这样的:
Mapper 实例执行相应的sql
现在我们大概知道了:
所以,
这个问题列表可能会很长,大家可以考虑一下,根据自己的需要尽量解答!或许这些问题最终与开源项目本身无关!但仔细想想,你收获的远不止是看源码本身!
再循环
回合结束后,你可以再做一次:
不断拆解-