问题导读:
1、阅读源码方法有哪些?
2、委派模式如何理解?
3、模板方法如何操作?
4、如何理解关心主线方法?
文章目录
- 阅读源码最好的方法
- 心态
- 快捷键
- 书签(Bookmarks)相关(不建议)
- 委派模式
- 模板方法
- 继承
- Spring中命名含义
- 阅读顺序
- 核心方法
- 关心主线
- 知其然知其所以然
阅读源码最好的方法
类的跨度比较少的(JUC)画流程图
类的跨度比较大的(大型框架 spirng、netty、dubbo、zk等)画时序图
心态
慢慢读,静下心来,像读一本书一样去理解。
快捷键
书签(Bookmarks)相关(不建议)
如何同步?
通过搜索引擎没有找到好的办法,但是我在C:\Users\Administrator\.IntelliJIdea2019.3\config\workspace\1Xk7dsjvaLv3yKonGopOrZMVL3v.xml里面找到了相关的配置,可以保存这个xml,甚至想办法,按照某种规则,替换掉另一台电脑的当前配置,直接导入。
mac是在cd ~/Library/Preferences/IntelliJIdea2019.3/workspace
纠正下:目前我没有发现能够同步书签的方法,只能保存上面xml,再次手动设置,如果谁有好的方法,请不吝告诉我,万分感谢!
具体查看我的另一篇文章:idea中书签的同步?
更新:通过书签的方式阅读源码不是一个很好的方式,不够直观。
委派模式
如果点击A方法的实现点击过去是一个接口,这个时候直接回来A方法然后点击被谁实现(option+command+b)
即如果遇到委派模式,想要看方法的实现,不要用command+b,用option+command+b
模板方法
如果点击一个方法欲找到真正的实现类,明确知道是A,却发现没有A中没有这个方法的实现,说明是在抽象类中进行的实现,在抽象类的模板方法中又回调会A
比如根据Dubbo中的SPI机制,明知道消费端的invoke是被(InvokeerInvocationHandler(MockClusterWrapper(FailOverCluster(directory)))).invoke() 层层包装,到了MockClusterWrapper中的this.invoker.invoke(invocation);却发现没有FailOverCluster,这个时候应该去看抽象类
继承
多平平无奇的两个字,可是平常就是一时想不到。
就是子类中没有看到需要的方法的时候,要想到去父类,父类会再调用相应方法回到子类本身,跟模板方法有点类似,但是不是抽象的。
Spring中命名含义
一个很好的阅读源码的技巧就是看他的命名,通过命名看出内在的含义。
如果方法是support结尾的、包名是support的,一般是工具类的意思,是扩展
如果方法是do开头的,说明真正要开始干活了
beans包中,都是配置、规范、标准
context是具体的实现
config包是保存配置信息
阅读顺序
- if(){
- ...
- }else if{
- ...
- }else if{
- ...
- }else if{
- ...
- }else if{
- ...
- }else{
- ...
- }
复制代码
这种格式的代码,直接看最后一个else,这里可能就是所有可能中第一次进来的地方,比如CHM、FutureTasl
核心方法
看核心方法,源码最后一行可能很关键,能把整个方法串起来,记最底部的方法和方法中的参数,一块的逻辑基本就明白了
例如:zookeeper中的watcher源码只要看到ReplyHeader r = cnxn.subllllmitRequest(h, request, response, wcb);就可以了,前面一大段只是对于各个参数的获取和封装。
关心主线
先关心主线,主线完成再看细节,否则容易陷入到细节中,思路混乱,所以有的方法只要知道目的就好了。
比如dubbo的服务发布、注册,以及消费端订阅,其中可能有服务降级、服务容错等策略,可以先跳过,避免影响整体思路
知其然知其所以然
想要明白dubbo中的调用机制,必须要懂dubbo中的spi机制,否则好几十个类,不知道究竟这个方法是在哪里被调用的,也根本无法继续往下看。
作者:Leesin Dong
来源:https://blog.csdn.net/dataiyangu/article/details/103866217
最新经典文章,欢迎关注公众号
|