生活工程体验信仰哲学精神
快软网
精神世界
探索历史
哲学文学
艺术价值
信仰创造
境界审美
体验技术
技能工具
工程信息
医学生产
生活运用
操作能力

如何高效阅读源代码?

3月15日 逆落雪投稿
  下面是之前写的一篇文章:《如何快速阅读源码》
  本文探讨在需要了解一个开源项目时,如何快速的理清开源项目的代码逻辑!
  以下是个人认为行之有效的方法:
  先跑起来自顶向下拆解深入细节延伸改进本文以Mybatis为例来进行演示!
  先“跑起来”程序界有个老传统,学习新技术时都是从HelloWorld开始的!无论是学习新语言时,打印HelloW还是学习新框架时编写个demo!那为什么这里的跑起来要打个引号呢?
  实际上,当你想要阅读一个开源项目的源码时,绝大部分情况下,你已经能够使用这个开源项目了!所以这里的“跑起来”就不是写个HelloWorld,也不是能跑起来的程序了!而是能在你的脑子里跑起来!什么意思?
  Mybatis你会用了吧?那么请问Mybatis是如何执行的呢?仔细想想,你能否用完整的语句把它描述出来?
  这里是Mybatis的官方入门文章!你是如何看这篇文章的?读一遍就行了吗?还是跟着文章跑一遍就够了吗?从这篇文章里你能获得多少信息?
  我们来理一下:
  安装如何在项目中引入Mybatis?Mybatis的groupId是什么?artifactId又是什么?目前最新版本是多少?从XML中构建SqlSessionFactorySqlSessionFactoryBuilder可以通过xml或者Configuration来构建SqlSessionFactory,那是如何构建的呢?xml配置了哪些信息?既然使用了xml,那肯定有xml解析,用什么方式解析的?xml里的标签都是什么意思:configuration,environments,transactionManager,dataSource,mappers。以及这些标签的属性分别是什么意思?SqlSessionFactory的作用是什么?不使用XML构建SqlSessionFactoryBlogDataSourceFactory,DataSource,TransactionFactory,Environment,Configuration这些类的作用是什么?Mapper的作用是什么?为什么提供基于XML和Java的两种配置方式?这两种配置方式的优缺点是什么?从SqlSessionFactory中获取SqlSessionSqlSession的作用是什么?selectOne和getMapper的执行方式有什么区别?探究已映射的SQL语句Mapper。xml的配置是什么?命名空间,id的作用是什么?Mapper。xml是如何和Mapper。java进行匹配的?匹配规则是什么?基于注解的映射配置如何使用?为什么提供基于XML和基于注解的两种映射配置?有什么优劣?作用域(Scope)和生命周期SqlSessionFactoryBuilder应该在哪个作用域使用?为什么?SqlSessionFactory应该在哪个作用域使用?为什么?SqlSession应该在哪个作用域使用?为什么?Mapper实例应该在哪个作用域使用?为什么?回答出了上面这些问题!你也就基本能在脑子里把Mybatis跑起来了!之后,你才能正真的开始阅读源码!
  当你能把一个开源项目跑起来后,实际上你就有了对开源项目最初步的了解了!就像书的索引一样!基于这个索引,我们一步步的进行拆解,来细化出下一层的结构和流程,期间可能需要深入技术细节,考量实现,考虑是否有更好的实现方案!也就是说后面的三步并不是线性的,而是不断交替执行的一个过程!最终就形成一个完整的源码执行流程!
  自顶向下拆解继续通过Mybatis来演示(限于篇幅,我只演示一个大概流程)!我们现在已经有了一个大概的流程了:
  SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类虽说每个点都可以往下细化,但是也分个轻重缓急!
  我们是先了解怎么构建SqlSessionFactory呢?还是了解如何获取SqlSession呢?还是了解SqlSession如何执行sql的呢?很明显,SqlSession去执行sql才是Mybatis的核心!我们先从这个点入手!
  首先,你当然得先下载Mybatis的源码了(请自行下载)!
  我们直接去看SqlSession!它是个接口,里面有一堆执行sql的方法!
  这里只列出了一部分方法:
  SqlSession就是通过这些方法来执行sql的!我们直接看我们常用的,也是Mybatis推荐的用法,就是基于Mapper的执行!也就是说SqlSession通过Mapper来执行具体的sql!上面的流程也就细化成了:
  SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类SqlSession获取对应的Mapper实例Mapper实例来执行相应的sql那SqlSession是如何获取Mapper的呢?Mapper又是如何执行sql的呢?
  深入细节我们来看SqlSession的实现!SqlSession有两个实现类SqlSessionManager和DefaultSqlSession!通过IDE的引用功能可以查看两个类的使用情况。你会发现SqlSessionManager实际并没有使用!而DefaultSqlSession是通过DefaultSqlSessionFactory构建的!所以我们来看DefaultSqlSession是如何构建Mapper的!
  它直接委托给了Configuration的getMapper方法!
  Configuration又委托给了MapperRegistry类的getMapper方法!
  在MapperRegistry类的getMapper中:
  通过type从knownMappers中获取对应的MapperProxyFactory实例如果不存在则抛出异常如果存在则调用mapperProxyFactory。newInstance(sqlSession)创建对应的Mapper在这里knowMappers是什么?MapperProxyFactory又是什么?mapperProxyFactory。newInstance(sqlSession)具体做了什么?
  其实很简单,knowMappers是个Map,里面包含了class与对应的MapperProxyFactory的对应关系!MapperProxyFactory通过newInstance来构建对应的Mapper(实际上是Mapper的代理)!
  快接近真相了,看mapperProxyFactory。newInstance(sqlSession)里的代码:
  这里干了什么?
  通过sqlSession,mapperInterface和methodCache构建了一个MapperProxy对象然后通过Java的动态代理,来生成了Mapper的代理类将Mapper方法的执行都委托给了MapperProxy去执行
  如果是Object里的方法则直接执行否则执行MapperMethod的execute方法
  最终实际还是委托给了sqlSession去执行具体的sql!后面具体怎么实现的就自行查看吧!
  延伸改进现在我们的流程大概是这样的一个过程:
  SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类SqlSession获取对应的Mapper实例DefaultSqlSession。getMapperConfiguration。getMapperMapperRegistry。getMappermapperProxyFactory。newInstance(sqlSession)通过sqlSession,mapperInterface和methodCache构建了一个MapperProxy对象然后通过Java的动态代理,来生成了Mapper的代理类Mapper实例来执行相应的sql将Mapper方法的执行都委托给了MapperProxy去执行如果是Object里的方法则直接执行否则执行MapperMethod的execute方法最终还是委托给sqlSession去执行sql现在我们大概知道了:
  为什么Mapper是个接口了Mybatis基于这个接口做了什么那么,
  什么是动态代理(基础哦)?为什么使用动态代理来处理?基于动态代理有什么优点?又有什么缺点?除了动态代理,还有其它什么实现方式吗?比如说cglib?如果是其它语言的话,有没有什么好的实现方式呢?。。。。。。这个问题列表可以很长,可以按个人需要去思考并尝试回答!可能最终这些问题已经和开源项目本身没有什么关系了!但是你思考后的收获要比看源码本身要多得多!
  再循环一轮结束后,可以再次进行:
  自顶向下拆解深入细节延伸改进不断的拆解深入改进,最终你能通过一个开源项目,学习到远比开源项目本身多得多的知识!
  最重要的是,你的流程是完整的。无论是最初的大致流程:
  SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类还是到最终深入的细枝末节,都是个完整的流程!
  这样的好处是,你的时间能自由控制:
  你是要花个半天时间,了解大致流程还是花个几天理解细节流程还是花个几周,几个月来深入思考,不断延伸你都可以从之前的流程中快速进行下去!而不像debug那样的方式,需要一下子花费很长的时间去一步步的理流程,费时费力、收效很小,而且如果中断了就很难继续了!
  总结本文通过梳理Mybatis源码的一个简单流程,来讲述一个个人认为比较好的阅读源码的方式,并阐述此方法与传统debug方式相比的优势。
投诉 评论 转载

到底什么是幸福?热评聚热点网 谢邀!每个人对幸福的理解都不同,其实幸福是很简单的,是自己的一种感觉,也是心态,把自己的心态调整好,每天活在快乐中,就很幸福,有一个温暖和睦的家庭,家人平安健康,承担家庭……无人知晓真实事件结局?热闻聚热点网 1988年7月18日,房东因为拖欠房租的问题找来了警员,说因为家里没有大人,这里几乎成了不良少年的聚集地。当警员到达这个公寓时,他看到的就是两个瘦骨嶙峋的女孩躺在地上,屋……有朋友帮卖私油的开车被抓了怎么办?热传聚热点网 一、有朋友帮卖私油的开车被抓了怎么办?1、有朋友帮卖私油的开车被抓了首先可以为其聘请律师,刑事案件立案后,犯罪嫌疑人自被侦查机关第一次讯问或者采取强制措施之日起,就可以聘……诉讼离婚怎么再婚热传聚热点网 诉讼离婚后再婚,当事人需持法院的判决书(调解书)办理结婚登记。办理结婚登记需要的手续:1、当事人双方身份证、户口本原件;2、3张2寸红底双人照;3、婚检证明(……川渝部分地区成功实现人工增雨重庆20个区县下雨热议聚热点网 【重庆20个区县下雨】据重庆市气象台统计,8月25日7时至26日7时,城口县部分地区出现中雨到大雨,局地暴雨。大渡口区、九龙坡区、巴南区、潼南区、大足区、荣昌区、江津区、……遗属补助标准标准热文聚热点网 问:遗属补助标准标准律师解答:遗属补助标准:以维持当地人民生活水平为原则,按照应享受遗属补助的人数和标准计算,总额不得超过死者生前的工资。具体标准由各省、市、自治区……事业单位有哪些?热议聚热点网 问:事业单位有哪些?律师解答:事业单位是指由政府利用国有资产设立的,从事教育、科技、文化、卫生等活动的社会服务组织。那么事业单位有哪些呢?国务院共有社科院中科……违约金和损失赔偿金是否可以同时主张?热闻聚热点网 问:违约金和损失赔偿金是否可以同时主张?律师解答:违约金和损失赔偿金不能同时主张。因为我国法律规定,当事人约定的违约金以违约方订立合同时可以预见的违约损失为基础进行……叫人打架犯什么罪?热闻聚热点网 问:叫人打架犯什么罪?律师解答:叫人打架的叫人是指集合、组织,至少是《治安管理处罚法》的违法行为,容易构成聚众斗殴罪。聚众斗殴的,对主要分子和其他积极参与的,处三年……在网上造谣怎么判热议聚热点网 问:在网上造谣怎么判律师解答:看具体情况定。造谣可能涉及不同的罪名,如果涉嫌诬告陷害罪,要处三年以下有期徒刑、拘役或者管制;造成严重后果的,处三年以上十年以下有期徒……如何高效阅读源代码?热博聚热点网 下面是之前写的一篇文章:《如何快速阅读源码》本文探讨在需要了解一个开源项目时,如何快速的理清开源项目的代码逻辑!以下是个人认为行之有效的方法:先跑起来自顶向下……高速事故处理流程?热文聚热点网 问:高速事故处理流程?律师解答:驾驶机动车是有风险,当在发生风险后,我们应该如何处理呢?不要慌张,下面法律知识网小编给大家介绍高速事故处理流程。一、驾驶人在高……
发给情人的愚人节小笑话热评聚热点网 广西桂林游记初中作文热议聚热点网 母亲节感恩作文800字热博聚热点网 小学生描写冬天小作文600字热传聚热点网 小学母爱的作文400字热传聚热点网 快乐一家人作文热闻聚热点网 花鸟园游记作文热博聚热点网 《鲁滨逊漂流记》读书笔记作文热议聚热点网 幸福的作文400字热评聚热点网 呼唤坚强初三作文热博聚热点网 最美丽的夕阳作文400字热评聚热点网 少壮不努力,老大徒伤悲议论文热文聚热点网
折叠屏手机销量火爆一度加价,会成为市场主流吗从今后,梦魂千里,夜夜岳阳楼。远红外线按摩器哪些品牌好远红外线按摩器品牌推荐详解二手房贷款过户流程?绝地求生首次免费有Steam账号就能玩牛顿的一生人存在的三种方式义教语文九上教学用书唐雎不辱使命盟卡车神的技能北京普通公务员是个什么生活水平?老年人适合用跑步机吗情场得意却错过绝杀!湖人旧将留遗憾,大将军爆笑为詹姆斯出头

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找新乡渭南铜川松江山南雅安松原荃湾淮北昭通平凉鞍山赤峰苗栗保亭池州渝北株洲陇南濮阳三沙秀山密云鸡西