关注“Java后端技术全栈”
回复“面试”获取全套面试材料
背景
最近,听到很多吐槽:看到源码,心中就感到非常纠结、特地懊恼。
为什么纠结?
因为面试的时候,面试官很喜爱问:你看过什么框架源码?JDK源码也行。
这时候,如果答复没有看过,尽管没让你立马回去等告诉。但兴许,你在面试官心中的印象就大打折扣了。
如果答复看过,并且还能较为流利地说上一番,那面试官或者会在心里赞叹:小伙子能够呀!(PS:很多面试官本人也没看过,或者看过很多也忘了)。
总之,你要是能说上个123,那给面试官的印象就会杠杠滴好。何愁工作?何愁加薪?
为什么烦?
大部分人的状况是:源码不是没有看过,而是每次只看得下一部分。为什么只看得下一部分呢?通常有上面三种起因:
- 不足技术撑持。看源码是须要技术撑持的,不是轻易一个小白也能看懂的。没有一些技术撑持,你顶多看看一小段,而后就看不下去,于是就放弃了。
- 不足正确心态。看源码的确挺无聊的,如果大家心态没放好,把它当做一种工作去做,必定感觉无聊,而且很容易放弃。
- 不足足够工夫。的确很忙,常常看了一部分后,天天加班,没工夫看,忙完后又忘了之前正在看的某某源码。
集体倡议
对于个别java程序员来说,浏览源码之前到底须要些什么技能呢?
集体倡议,以下基础知识必须会一些:
会设计模式:包含单例模式、工厂模式、代理模式、装璜器模式、责任链模式、模板办法模式等。
会猜想:大胆的猜想,在看源码的时候,多站在高层次想想,如果你是Mybatis的设计者,你会怎么设计?
会挑重点看:别被没写参数校验、类型校验等问题卡在那里。
会画图:流程图、类图等,找一些在线画图工具,媒体画完就保留下来,如果中途一段时间不看了,再回头看看这些图,也能疾速持续。
Mybatis源码剖析
明天,咱们就来看看Mybatis源码的浏览,具体举个例子来看看:
案例和疑难
从咱们最后的demo中开始:
public static void main(String[] args) { String resource = "mybatis-config.xml"; InputStream inputStream = null; SqlSession sqlSession = null; try { inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSession = sqlSessionFactory.openSession(); User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById", 1); System.out.println(user); } catch (Exception e) { e.printStackTrace(); } finally { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } sqlSession.close(); } }
对于获取数据流inputStream,这个咱们就不探讨了,咱们次要关注重点。
对于下面demo,咱们能够分成五个步骤:
第一步,创立一个工厂类sqlSessionFactory。
配置文件的解析就是在这里实现的。包含mybatis-config.xml
和咱们的Mapper.xml映射器文件。这一步咱们关怀的内容是:解析的时候做了什么?产生了什么对象,解析的后果放在哪里的。因为这将意味着,咱们前面应用的时候去哪里获取这项配置项内容。
第二步,通过SqlSessionFactory创立一个SqlSession。
那么问题来了,SqlSession中定义了各种增删改查的API,是给客户端调用,返回的是什么实现类?除了SqlSession以外,咱们还创立了什么对象,创立了什么环境?
第三步,获取到一个Mapper对象。
问题来了UserMapper.java是一个接口,并没有为它创立实现类,那又是怎么被实例化的呢?咱们应用的这个Mapper对象到底是什么对象呢?为什么要从SqlSession里去获取呢?为什么传进去一个接口,而后还要用一个接口去接管呢?
第四步,调用接口办法。
问题是咱们的接口没有实现类,为什么就能够间接调用它的办法呢?那它调用的是谁的办法呢?是如何把SQL给关联起来的呢?是如何获取到数据的呢?
第五步,敞开相干资源。
开始源码剖析过程
因为波及到内容较多,上面就用几张图来展现整个流程。咱们能够通过这几张图来疾速翻阅Mybatis的源码。
第一步
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
这一句代码的整个流程如下:
依据inputStream,解析配置文件,创立出一个DefaultSqlSessionFactory默认的SqlSessionFactory 实现类。构建出一个工厂类,这个工厂类专门用来创立SqlSession对象的。
第二步
SqlSession sqlSession = sqlSessionFactory.openSession();
获取SqlSession的整个流程如下:
第三步
User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById", 1);
第三步和第四步就是这行代码画的。
这一步是返回一个映射器代理类,映射器代理类专门用来给UserMapper接口和UserMapper.xml绑定的代理类。创立进去的代理类就能够实例化了,而后就能够调用UserMapper接口的方了。
第四步:调用代理对象执行SQL的整个过程。
第五步,敞开资源。
心愿大家依照这个流程,找点源码看看。听他人的看他人永远是他人的。
动起来吧!
总结
其实,没什么好总结的。好好领悟一下为什么纠结吧!同时心愿能看看我的倡议,作为一个过来人,心愿能帮忙大家少走弯路。
最初,对于Mybatis源码浏览的整个流程,最好是本地环境搭起来,而后搞个demo,debug模式一步一步走起。
举荐浏览
《图解数据结构》.pdf
7种启动Spring Boot我的项目的形式,一次性打包说给你听
JVM真香系列:图解垃圾回收器