如何高效阅读源代码?( 二 )


首先,你当然得先下载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?如果是其它语言的话,有没有什么好的实现方式呢?......这个问题列表可以很长,可以按个人需要去思考并尝试回答!可能最终这些问题已经和开源项目本身没有什么关系了!但是你思考后的收获要比看源码本身要多得多!
再循环一轮结束后,可以再次进行:
自顶向下拆解深入细节延伸改进不断的拆解->深入->改进,最终你能__通过一个开源项目,学习到远比开源项目本身多得多的知识__!
最重要的是,你的流程是完整的 。无论是最初的大致流程:


以上关于本文的内容,仅作参考!温馨提示:如遇专业性较强的问题(如:疾病、健康、理财等),还请咨询专业人士给予相关指导!

「辽宁龙网」www.liaoninglong.com小编还为您精选了以下内容,希望对您有所帮助: