如何快速的理清开源项目的代码逻辑(一)

优采云 发布时间: 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

  现在我们大概知道了:

  所以,

  这个问题列表可能会很长,大家可以考虑一下,根据自己的需要尽量解答!或许这些问题最终与开源项目本身无关!但仔细想想,你收获的远不止是看源码本身!

  再循环

  回合结束后,你可以再做一次:

  不断拆解-

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线