分析开源项目源码,咱们该怎么入手分析?(授人以渔)

小微 科技分析开源项目源码,咱们该怎么入手分析?(授人以渔)已关闭评论103字数 2912阅读模式
摘要作者:源码笔记1 前言本文接上篇文章跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?,那么本篇文章再继续跟小伙伴们聊聊源码这个话题。在工作之余开始写SpringBoot源码分...

1

在工作之余开始写SpringBoot源码分析专栏前,跟小火伴们聊聊“分析开源项目源码,咱们该怎么入手分析?”这个话题,咱们就随意扯皮,反恰是跟小火伴们一块儿学习交换,不必要太正式。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16673.html

2 学习开源框架源码到底难不难?文章源自微观生活(93wg.com)微观生活-https://93wg.com/16673.html

那么,先跟小火伴们聊聊学习开源框架源码的感受,请问你们认为学习开源框架源码到底难不难?这是一个开放的话题,堪称仁者见仁,智者见智。有一些开源大牛们会说,So easy!;有一些有源码浏览习惯且工作多年的小火伴们会说,还好。;有一些刚开始学习源码的小火伴们会说,太难了!。是的,不同工作经验不同技术层次的人的回答是不同样的。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16673.html

那么刚开始学习开源项目源码难不难呢?应当对绝大部份小火伴们来讲应当是偏难的。为何呢?可能有下列四点缘由:文章源自微观生活(93wg.com)微观生活-https://93wg.com/16673.html

一个能流行起来的成熟的开源项目必然功能齐全,可扩大,而功能齐全可扩大的开源项目必然很繁杂,代码量大。比如Spring5框架的源码行数到达了六七十万行,SpringBoot的源码行数到达了25万行左右,Dubbo以及RocketMQ的源码行数到达了10万行。一个成熟的开源项目代码量这么多,可以想象其有多繁杂。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16673.html

浏览源码时,咱们有时候没法猜透源码文章源自微观生活(93wg.com)微观生活-https://93wg.com/16673.html

那么,咱们该怎么入手去分析开源框架源码呢?文章源自微观生活(93wg.com)微观生活-https://93wg.com/16673.html

首先,结合前面所说的浏览源码之所以难的缘由,咱们就要有针对性的去战胜解决。比如有空多学学设计模式,算法以及英语。这些软实力确切对浏览源码有很大帮助。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16673.html

其次,浏览源码的条件是什么?固然,浏览源码是要树立在会使用的基础上,就像若还不会走路就学骑单车同样,若连用都不会就去研究源码可能会事与愿违。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16673.html

最后,咱们浏览源码要注意一些技巧,现在依据本身阅历总结一下相关思路以及技巧,如下:文章源自微观生活(93wg.com)微观生活-https://93wg.com/16673.html

开始浏览源码时,先对框架的模块及其关系有一个总体的认识。咱们要对框架项目的模块以及目录要有一个全盘的了解,要知道每一个模块是干吗的,然后要了解模块与模块之间的关系。

举个栗子,比如Dubbo的模块分包核心的主要有下列八个,如下图,咱们要知道最基础的的模块应当是dubbo-co妹妹on公共逻辑模块,这个模块作为最基础的模块,主要是提供了通用模型以及工具类;然后dubbo-remoting是远程通信模块,依赖于dubbo-co妹妹on模块,至关于Dubbo协定的实现;而dubbo-rpc则是远程调用模块,依赖于dubbo-remoting模块,抽象各种协定,和动态代理;dubbo-cluster是集群模块,依赖于dubbo-rpc模块,将多个服务提供方假装为一个提供方,包含:负载均衡, 容错,路由等。

2.分析源码先从父类或父接口开始分析。由于父类或者父接口常常代表了一类功能,这些基类或基类接口常常抽象了各个具体子类共有的属性以及行动,一些比较基础的办法都在父类中实现,然后留个模板办法给子类去实现便可(模板办法的利用)。

举个栗子,这里还是拿Dubbo的负载均衡来讲吧,如下图,LoadBalance是各种负载均衡策略的超级接口,定义了 select 办法用来实现选择哪台机器;然后AbstractLoadBalance是一个抽象类,实现了LoadBalance接口,在覆盖了 select 办法后,其又增添了 calculateWarmupWeight 以及 getWeight 权重相关的两个办法,由于这些办法都跟具体的负载均衡策略类有关,故在父类实现了。值得注意的是AbstractLoadBalance抽象类的 select 办法中里留了个给子类覆盖的 doSelect 办法,具体的负载均衡策略将在doSelect中实现。

3.浏览源码前首先要找到启动类。浏览分析源码时要先从启动类开始,因而找到框架启动的入口很重要。

4.浏览源码时要分清主干以及枝节代码。找到启动入口后,然后就能够顺着启动入口一步一步调试来浏览源码了。无非在初次调试源码时值得注意的是一定要分清主次代码,即要先浏览主干代码,其他枝枝节节的代码没明白的可以放一边。切忌一开始就深刻细节然后出不来了,这样就会造成只见冰山一角而看不到全貌的感觉。

5.浏览源码前要分清主次模块。即浏览分析源码不能漫无目的,全盘通读,咱们要从咱们平时有用到的模块开始分析。每一个人的时间都很可贵,咱们要把时间花在刀刃上。比如SpringBoot增添的新特性中有自动配置,而自动配置特性又无比重要,因而可以挑拣自动配置来进行源码分析。

6.要充沛应用源码项目的测试类。以前也说过,一个框架之所以能流行,必然是经由大量测试的。因而如果咱们像具体了解某个类以及某个办法,咱们可以充沛应用这些测试类来辅助咱们源码分析。

7.要学会一些调试技巧。这一点也很重要,比如在调试进程中怎么查看调用关系等等,这里不多说,怎么高效学习以及浏览源码这篇文章中分享了大量调试的干活,小火伴们可以瞅瞅。另外,还要学会有技巧的搜寻源码,说到这里,下面举个栗子。

举个Spring事件监听的栗子。比如咱们现在要知道哪一个监听器监听了ContextRefreshedEvent事件,此时咱们可以通过idea全局搜寻\"(ContextRefreshedEvent\"关键字,得到下列截图:从下图可以看到spring-webmvc模块的FrameworkServlet,spring-context模块的ScheduledAnnotationBeanPostProcessor,以及spring-jms模块的JmsListenerEndpointRegistry等类定阅了ContextRefreshedEvent事件,那么在容器刷新的时候这几个类将会监听到ContextRefreshedEvent事件,执行一些初始化逻辑。

8.确定还有大量的浏览源码技巧,但愿

4 学源码,谈实践,论坚持

最后,咱们学习源码不是为了学习而学习,最理想的效果咱们要学以至用。比如把从源码中学习到的设计模式,接口设计办法,面向对象原则以及相关算法等等均可以利用到咱们手头的项目中,这才是咱们学习源码的终究目的,也是源码学习的最理想的效果。可能这里有些小火伴会说,我平时介入的项目都是业务类的项目,而不是开发基础框架,开发中间件,CRUD比较多,可能学习基础框架的源码对咱们用途很少。并不是的,只要你有介入项目,学习源码咱们学习的是思想,咱们就能够把源码框架设计中的思想利用到咱们的项目中。

最后的最后,咱们来谈谈坚持,这是最难能宝贵的。不少大道理咱们都懂,比如要坚持运动,坚持学习,坚持...,可是就是没能坚持下来,包含我自己,嘿嘿。坚持这东西太南了,无非还是应当给自己立个flag吧,把自己有用到的框架比如SpringBoot,Spring,Mybatis,Dubbo,SpringCloud等框架源码都浏览分析一遍,加油,小火伴们共勉!

欢迎小火伴们在评论区补充源码浏览技巧哦,让笔者GET多点技能,嘿嘿。

若觉得不错,帮忙点个赞呗。

来自掘金,原文:https://juejin.im/entry/5e4d09a8f265da573e671f89

以上就是微观生活(93wg.com)关于“分析开源项目源码,咱们该怎么入手分析?(授人以渔)”的详细内容,希望对大家有所帮助!

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/16673.html