源代码阅读器

源代码阅读器,第1张

以下是之前写的一篇文章:《如何快速阅读源代码

本文讨论的是当你需要了解一个开源项目时,如何快速整理出它的代码逻辑!

以下是我个人认为有效的方法:

先“跑”吧。自上而下拆解,深化细节,延伸完善。本文以Mybatis为例进行论证!

编程界有一个老传统“先跑起来”。学习新技术,都是从“Hello World”开始的!每当学习一门新的语言时,打印“Hello World ”;或者在学习新框架的时候写一个demo!那为什么这里的“跑”要加引号呢?

其实当你想看一个开源项目的源代码的时候,大多数情况下,你已经可以使用开源项目了!所以这里的“运行”不是一个“Hello World”或者一个可以运行的程序!但是能在你的脑海中运行吗?你什么意思?

Mybatis你会用吗?那么Mybatis是如何实现的呢?仔细想想,能用完整的句子描述一下吗?

这里是Mybatis的官方入门文章!你怎么看这篇文章?你能读一遍吗?还是贯穿文章就够了?你能从这篇文章中获得多少信息?

让我们直说吧:

如何将Mybatis安装到项目中?Mybatis的groupId是什么?什么是artifactId?最新版本是什么?从xml构建SqlSessionFactorySqlSessionFactoryBuilder可以通过XML或配置构建SQL SessionFactory。它是如何建造的?xml中配置了哪些信息?既然使用了xml,就必须有xml解析。用什么方式?xml中的标签是什么意思:配置、环境、事务管理器、数据源、映射器。而这些标签的属性是什么意思?SqlSessionFactory的作用是什么?不使用XML构建sqlsessionfactoryblogDataSourcefactory、datasource、TransactionFactory、Environment、Configuration类的作用是什么?*Mapper的作用是什么?为什么提供基于XML和Java两种配置方式?两种配置各有什么优缺点?从SqlSessionFactory获取SqlSessionSqlSession的作用是什么?selectOne和getMapper的执行方式有什么区别?映射的SQL语句*Mapper.xml的配置是什么?id在命名空之间有什么作用?*Mapper.xml如何匹配*Mapper.java?匹配规则是什么?如何使用基于注释的映射配置?为什么提供了基于XML和注释的两种映射配置?有什么优缺点?范围和生命周期SqlSessionFactoryBuilder应该用于哪个范围?为什么?应该在哪个范围内使用SqlSessionFactory?为什么?SqlSession应该在哪个范围内使用?为什么?映射器实例应在哪个范围内使用?为什么?回答了以上问题!你基本上可以在脑子里“运行”Mybatis了!之后,你就可以真正开始阅读源代码了!

当你能“运行”一个开源项目的时候,其实你已经对开源项目有了最初步的了解!就像书的索引一样!基于这个指标,我们一步一步的拆解,提炼下一层的结构和流程。这期间可能需要深入技术细节,考虑实现,考虑是否有更好的实现方案!也就是说,接下来的三步并不是线性的,而是_ _不断交替执行_ _的过程!最后形成一个完整的源代码执行流程!

自上而下的拆卸继续通过Mybatis演示(篇幅有限,我只演示一个大概的过程)!现在我们有了一个通用流程:

SqlSessionFactoryBuilder通过xml或配置生成一个SqlSessionFactory。可以从sqlsessionfactory获取SqlSessionFactory。Sqlsessionforybuilder是一个实际执行sql的类。虽然每一点都可以细化下来,但也是有轻重缓急的!

我们要不要先了解一下如何构建SqlSessionFactory?或者你知道怎么得到SqlSession吗?或者你知道SqlSession是怎么执行sql的吗?显然,执行sql的SqlSession是Mybatis的核心!先从这一点说起吧!

首先当然要先下载Mybatis的源代码(请自行下载)!

直接上SqlSession吧!它是一个有一堆执行sql的方法的接口!

这里只列出了一些方法:

SqlSession通过这些方法执行sql!直接看我们常用的用法,也是Mybatis推荐的,就是基于Mapper的实现!也就是说“SqlSession通过Mapper执行特定的sql”!上述过程被细化为:

SqlSessionFactoryBuilder通过xml或配置生成SqlSessionFactory。可以从sqlsessionfactory获取SqlSessionFactory。SqlSession是一类实际执行sql的sql,获取对应的Mapper实例Mapper实例来执行对应的SQL。SqlSession如何获取映射器?Mapper如何执行sql?

深入细节,我们来看看SqlSession的实现!SqlSession有两个实现类:SqlSessionManager和DefaultSqlSession!这两个类的用法可以通过IDE的引用功能来查看。你会发现实际上并没有用到SqlSessionManager!而DefaultSqlSession是由DefaultSqlSessionFactory构建的!所以我们来看看DefaultSqlSession是如何构建Mapper的!

它直接委托给配置的getMapper方法!

配置被委托给MapperRegistry类的getMapper方法!

在MapperRegistry类的getMapper中:

Type从knownMappers获取相应的MapperProxyFactory实例。如果不存在,就会抛出异常。如果是,它将调用mapperproxyfactory . new instance(SQL会话)来创建相应的映射器。这里有什么已知地图?什么是MapperProxyFactory?mapperproxyfactory . new instance(SQL会话)到底做了什么?

其实很简单。knowMappers是一个映射,包含了class和对应的MapperProxyFactory之间的对应关系!MapperProxyFactory通过newInstance构建对应的Mapper(其实就是Mapper的代理)!

接近真相,看看mapperproxyfactory . new instance(SQL会话)中的代码:

这里做了什么?

由sqlSession、mapperInterface和methodCache构造一个MapperProxy对象,然后由Java动态代理生成Mapper的代理类,将Mapper方法委托给MapperProxy。

如果是Object中的方法,直接执行;否则,执行MapperMethod的execute方法。

实际上是委托给sqlSession来执行具体的sql!以后自己看怎么实现吧!

扩展我们目前的流程大概是这样一个流程:

SqlSessionFactoryBuilder通过xml或配置生成一个SqlSessionFactory。可以从sqlsessionfactory获取SqlSessionFactory。SqlSession是sql的一个类,实际执行SQL,得到对应的Mapper实例DefaultSql。会话。getmapperconfiguration。getmappercomparehistory。getmappercompproxyfactory。newinstance (sqlSession)通过sqlSession,MapperInterface和methodCache构建一个MapperProxy对象,然后通过Java的动态代理,Mapper instance,即Mapper的代理类,生成执行相应的SQL。MapperMethod委托给MapperProxy执行。如果是Object中的方法,会直接执行。否则Mapper方法的execute方法最终会委托给sqlSession来执行sql。现在我们大概知道:

为什么Mapper是一个接口?Mybatis基于这个接口做了什么?所以,

什么是动态代理(基本)?为什么要用动态代理来处理?动态代理的优势是什么?缺点是什么?除了动态代理还有其他实现吗?比如cglib?如果是另一种语言,有什么好的实现方法吗?......这个问题列表可以很长,大家可以想一想,根据个人需求尝试回答!也许到最后,这些问题都和开源项目本身无关!但是你思考后的收获会比看源代码本身多!

经过一轮回收后,可以再次进行:

自上而下的反汇编,深入的细节延伸,改进和持续反汇编-->:深入-->:改进,最后你可以_ _通过一个开源项目学到比开源项目本身多得多的知识_ _!

最重要的是,你的流程完成了。无论是最初的一般过程:

SqlSessionFactoryBuilder通过xml或配置生成一个SqlSessionFactory。您可以从sqlsessionfactory获取SqlSessionFactory。sqlsessionforybuilder是实际执行sql的类还是去最后的细节是一个完整的过程!

这样做的好处是你可以自由支配自己的时间:

是要花半天时间了解大致流程还是要花几天时间了解详细流程还是要花几周或几个月时间深入思考并不断延伸?可以从前面的流程快速进行!不像debug的方式,一下子一步一步的管理流程需要很长时间,费时费力,收效甚微,而且中断了很难继续!

总结了一个整理Mybatis源代码的简单过程,讲述了一种更好的读取源代码的方法,并阐述了这种方法相对于传统调试方法的优势。

欢迎分享,转载请注明来源:聚客百科

原文地址: https://juke.outofmemory.cn/life/694426.html

()
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-07-12
下一篇 2022-07-12

发表评论

登录后才能评论

评论列表(0条)

保存