如何高效阅读源代码
下面是之前写的一篇文章:《如何快速阅读源码》
本文探讨在需要了解一个开源项目时,如何快速的理清开源项目的代码逻辑!
以下是个人认为行之有效的方法:
先「跑起来」自顶向下拆解深入细节延伸改进本文以Mybatis为例来进行演示!
先“跑起来”程序界有个老传统,学习新技术时都是从「HelloWorld」开始的!无论是学习新语言时,打印「HelloWorld」;还是学习新框架时编写个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方式相比的优势。
有哪些相见恨晚的在线网站
需要“在线”操作,目的只有一个就是:将时间有效浓缩凝聚,去掉繁琐性,让工作更高效优质!既然是在线网站,那咱们就从在线这个基点出发。这里,我想给大家分享几个非常实用的在线网站,同时我相信你也一定会喜欢的!
①免费在线文件转换器网址传送门https://cn.office-converter.com/
免费,快速,在线转换媒体文件,无须安装任何软件。支持文档、视频、音频、图片、电子书、压缩包等等的在线转换,而每一个分类又支持多种格式。
②免费在线视频下载网址传送门https://www.apowersoft.cn/online-video-downloader
这款免费在线视频下载工具不仅可以下载诸如优酷、土豆、爱奇艺、腾讯、哔哩哔哩、DailyMotion等网站视频,还支持YouTube视频下载。它为您提供多样化的视频输出格式如MP4、3GP、FLV、WMV、MP3、WEBM、MOV等。它还可以根据您的需要下载超清视频。
③在线编辑各种工作文件网址传送门https://uzer.me/z/apps
无需安装任何的软件,即可在线编辑Office,CAD,PS,AI,PDF等任意格式文档,支持远程协作。即使你电脑一时半刻安装不上CAD而工作急需使用那也不必担心,这个在线网站能帮助你!
④全网在线视频免费观看网址传送门http://video.likeyunba.com/index.php
这是一个神奇的在线视频网站,在这里我们可以看到许许多多的新电影,有VIP的哦,不多解释了。
⑤公众号在线编辑器网址传送门http://bj.96weixin.com/
在这里我们可以直接套用它里面的模板,我们只需要改动下文字就可以让文章排版变得非常美观好看,实在是让人爱不释手。
⑥TinEye反向图像搜索网址传送门https://tineye.com/
这是一个强大的在线以图搜图网站,我们平时看到的一些图片想找到原图就可以通过这个在线网站去轻易找到,我们需要做的就是上传该图片的截图然后搜索。
关于在线网站我就分享以上6个了,如果还有补充的话,欢迎评论区留下精彩回复吧!让更多更好的东西让更多的人知道,期待你的参与哦!
动漫最全的网站是什么
来来来,给你介绍几个动漫比较全的网站。
天上人间动漫网国内更新速度快、动漫资源全的免费动画片大全、动漫网。(百度所得)据网友说,上面的动漫还是蛮全的,但是由于网络监管力度加大,上面的某些(你懂的)被删了。
B站(bilibili)b站,中国最大的acg弹幕网站,里面有几乎所有的动漫,除了少部分如银魂,柯南,火影(这些都是被那些土豆什么公司给垄断了的
风车动漫风车动漫拥有上万集高清晰画质的在线动漫,观看完全免费、无须注册、高速播放、更新及时的专业在线风车动漫站。
试用了以后,发现网站不太好进(不过这个好像有app),而且更新比较慢,资源但是挺多
天使动漫论坛天使动漫论坛成立于2010年10月1日。是一个以天使类动漫为题材的综合型动漫论坛,气氛温馨有爱,环境宽松,对新人非常友好。提供经典动画下载,新番下载和在线观看、讨论,动漫、同人音乐欣赏,系统萌化资源,原创作品展示平台,翻唱交流,同人主题交流(V家、东方等)等内容。
下载就去这个论坛,在线观看去dilidili。
NICONICO动画
弹幕视频网站,可以看番,还有网友制作的mad之类的,日本网站,日语不好的有点无力,不知道是我电脑问题还是什么,视频播放不了。
pixiv
画师图片聚集地,专门画图收图的网站,据说是网上所有动漫美图的来源,日本网站,日语不好的慎入,不知道是我电脑问题还是什么,看不到图片。
ACFun
弹幕视频网站,不是专业动漫网站,个人不是很推荐。
zero动漫网
各个类型的动漫都有,挺齐全
ps:以上说天使风车嘀哩这四个片子被爆的几率很大,不过上有政策下有对策,世界还是藏污纳垢的!
上面看不了就只能比特搜索和论坛挖掘了,比如二代目论坛或比特猫之类的。
总结
下载加在线的有:红旅动漫,zero动漫,天使动漫等等
专门下载的:极(和谐)影,漫游,动漫花园等等
专门在线的(这个多了去了):一般出名点的有腾讯,天上人间,178动漫等等。
最后说下中国很多动漫网站都关闭了,好多之前大家熟悉并且喜欢闲逛的网站都关门歇业了,关闭的漫游BT站,对于中国动漫粉丝来说,漫游BT绝对是超良心的存在,而它也曾被誉为动漫三大站,然而随着对盗版的打击,漫游BT宣布永久关闭,三大站世代就此落幕。
而另一个动漫资源网动漫花园也跟着离开。通过动漫花园网站已经无法访问的网页源代码,网友们发现了管理员的留言:“怎么说呢,感谢大佬们对Anime国内正版化做出的努力和投资吧,大势所趋,是我们退场的时候了。”这也给广大漫迷发出一种信号,过去依靠字幕组汉化组的翻译免费下载观看动漫作品的时代或许将要结束。没错,就像轻之文库他们说的,“一个时代终结了,一个新时代将会开始”。
书迷app怎么加书源
书迷app加书源的方法
1.
书迷小说要添加书源,首先要寻找书源,找到需要的导入的资源网站。
2.
添加书源有两种方法,分别是粘贴书源代码和扫描书源二维码。
3.
然后打开该软件app,点击设置页面图标,在弹出的侧边栏中,选择【书源管理】。
4.
找到选择【新建书源】。
5、在打开的“新建书源”页面中,选择【粘贴书源】。
6、此时,书源信息就被粘贴到页面中的相应位置了。
7、书迷小说若要使用书源二维码进行导入,长按书源二维码,选择【保存图片】,先将书源二维码保存到手机中。
8、回到书迷app的“新建书源”页面中,选择【二维码导入】。
9、在打开的“扫描二维码”页面中,点击【图库】,在手机图库中找到刚才保存的书源二维码图片进行扫描,即可导入书源。
起点小说书籍id如何提取
回答如下:起点小说书籍的id可以通过以下几种方式进行提取:
1.在起点网站上搜索书籍,进入书籍详情页,查看网址链接。通常书籍的id会包含在链接中,如:http://book.qidian.com/info/1017016494,则1017016494就是该书籍的id。
2.在起点网站上找到书籍后,可以在网页源代码中查找书籍id。可以使用浏览器的开发者工具,查看网页源代码,然后搜索关键词"bookId"或类似的字段,通常可以找到书籍的id。
3.使用起点小说的开放API接口获取书籍id。起点提供了一些开放API接口,可以通过调用这些接口来获取书籍的详细信息,包括id。具体的接口文档可以在起点官网或开发者文档中找到。
需要注意的是,起点小说的书籍id可能会有变动或更新,因此在提取id时需要注意确认是否为最新的id。
作者源代码的小说耽美
未世之鬼畜制造,逆袭吧!植物君,重生之匪无术,仙侠之我有一口棺,异世,买v才能看下去,后两篇还在连载!小说在微盘可以下!