一、为何要阅读源码
写了太多了if|else,想要看看别人写的代码如何,有一段时间看到一遍博文Java实现生命周期管理机制,当时就被这精妙的设计思想给蛰伏,同时也深深有感于它编码风格,感觉这如同一件艺术品一般。讲真的这是第一感觉编码不知是只有if|else以及curd。所以我开始想着去阅读源码,最开始我阅读的是mybatis,因为人都有习性,柿子捡软的捏,后面也会写相关的博文
二、如何阅读源码:
首先你得找准入口,一般在配置文件中都有。单也有例外那就是springboot,说实话要想读它的源码有点困难,因为你需要从若干的代码中分析它的流程,这里我们先不谈,如果我们理解了spring 、springmvc的代码之后,在稍稍了解一下springboot的自动配置的原理再去读它的源码也就不难了。
找准入口那只是第一步,找准接口后,我们就可以依据这个入口来画出它的树干了,但是这里我们先不要画出叶子了(这个后面再说)。这个时候你就需要借助于一些工具来辅助你完成你的这些工作。
三、阅读源码:
- 搭建环境:
这里我推荐大家使用简单的方式,可以依据官方的github来把代码clone下来研究,也可以直接搭建一个项目环境,边跑边研究,这里我经常使用的是后者。 借助于工具把框架的脉络描绘出来:
首先我们需要借助于mindmanger这款工具把项目的大体骨架给描述出来,例如springmvc的八大组件。mybatis的四大组件等等。然后借助于visio等uml工具把项目的执行的流程给画出来,知道每个组件之间是如何分工协作的, 这个时候你就可以思考他们框架的构建方式了,对于我们以后的代码的逻辑组织还是有一定的帮助的
到这个时候框架的整体脉络和骨架已经呈现在我们面前的,这个时候才是我们专注于某一点进行定点突破的时候,我最开始在看mybatis的源码的时候,我通过debug一直从入口SqlSessionFactoryBuilde里面的
build(parser.parse());
方法一直深入到配置文件的各个节点的解析,然后在点下去直接到了ognl的部分了,后来我才发现不能这样的搞,我们需要首先俯瞰这个源码,画出骨骼脉络之后,然后在逐一击破。这个时候就需要我们使用类图来来把相互之间的继承关系给画下来。
四、阅读源码的过程中,我们需要的先决知识
- 熟悉相关软件的用法:mindmanager、uml(visio)、及编辑器(idea)
- 熟悉设计模式(①:设计模式的原则;②:设计的应用以及变种)
- 对框架的原理稍有理解
- 对于java的反射注解有了解(这个几乎是必须的)
五、源码阅读的过程中,如何转换输出:
- 源码阅读的困扰:
很多的时候我们也会零零散散的去看一些源码,看完老是忘怎么办。是的,这个问题是真真实实的存在的,但是你要知道初次看源码之后他的大体的流程大体的组件我们是知道的,如果在带着问题去看我们会更加容易上手,所需要的时间将会大大降低,同时我们忘的是那些具体的代码,但是它的精华你是忘不了的,只有你研究的够透彻,他会深入你之后所写的代码之中的。 - 针对经常忘怎么办:
我们会把整个框架的点全部抽取到mindmanager里面,这是一个把“书”便薄的过程,这个时候我们会写博客再把“书”给变回来。这样就会加深我们的记忆。
六、对于写博客的一点见解:
最开始写博客的原因:
有一天我在学习rabbitmq,我通常学习东西的时候,我会找一个写了一整个系列的文章去看,同时也会看官网的文档教程(google翻译然后觉得句子不通在看英文,毕竟英文的阅读速度有点慢),再看的过程中我发现有很多都是copy官放文档,一上来没有场景的介绍,也没有相关的介绍,直接上代码,甚至相关的参数都没有介绍,有的博文虽然是一个系列,但是基本上是属于博主边学边写的缺乏系统性。同时我在学习东西的过程中总是会带着疑问去学习,有时候会看到一些博文去讲消息的可靠性呀,于是我带这个问题去研究,发现至今没有一篇博文能完整的将这个问题给将透彻,同时我在遇到问题的时候,当时我加了两个千人群,我把问题描述出来的时候,有人问我channel是什么,我当时有点吃惊,他说他没有使用过channel(他是直接整合的spring,然后spring有包装过一层的),然后给他解释了一下,这我就知道他们对这个问题不熟悉,同时在他们的问问中,我把这个问题描述了一下,然后他们都安静了,也有私聊我的问题一些相关的东西的。
在上面的过程中,我发现了我需要扩展我的交友的圈子(我之前也有朋友用过,但是他们也都不熟),如何把自己推销出去呢,在这个时候博客是最好的选择。
其实不仅仅是上面的原因,还有我也想的确写点东西,把自己学习的整个过程记录下来,但是我是在学完整个之后,回过头来从新来整理然后才写出来的。在写之前我会把我所理解的应用场景或者是网上写的好的相关的应用场景的介绍引用进来(我是直接挂的别人的博客的连接,这样应该不侵权吧,对这个不是太了解),然后才是相关的参数以及在应用的过程中所遇到的坑,同时有时也会结合一些源码来讲。总的来说还是希望能遇到一群志同道合的朋友,一起学习一起进步。
从写博客中得到了什么:
其实写博文的过程中挺好玩的,把躺在mindmanager里面的框框线条然后在通过发散在把这些东西输出到博客中,有些问题原来在研究的时候会跳过的,但是在写博客的过程中就会担心,万一大家问我这个问题怎么办,于是有老老实实的去看源码,去找相关的证据来佐证这个观点。所以写博文呢对于你的认识是一个升华的过程,同时也是把你的知识系统化的一个过程。其实不要小看系统化,估计很多人也会像我之前一样,平时没事儿也喜欢看一些博文(synchronized、volatile的原理)看着看着好像自己真的知道了点什么样的,可是让你讲吧你又将不出来个所以然,后来我才发现这个其实是没有一个系统化的过程。
以上只是个人的看法,如果有不同的意见探讨可以留言或者加群一起探讨交流