创意电子

标题: 分析开源项目源码,我们该如何入手分析?(授人以渔) [打印本页]

作者: Java技术架构    时间: 2020-2-21 09:08
标题: 分析开源项目源码,我们该如何入手分析?(授人以渔)
作者:源码笔记
1 前言

本文接上篇文章跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?,那么本篇文章再继续跟小伙伴们聊聊源码这个话题。
在工作之余开始写SpringBoot源码分析专栏前,跟小伙伴们聊聊“分析开源项目源码,我们该怎样入手分析?”这个话题,我们就任意扯皮,反正是跟小伙伴们一起学习交换,没必要太正式。
2 学习开源框架源码到底难不难?

那么,先跟小伙伴们聊聊学习开源框架源码的感受,请问你们认为学习开源框架源码到底难不难?这是一个开放的话题,可谓仁者见仁,智者见智。有一些开源大牛们会说,So easy!;有一些有源码阅读习惯且工作多年的小伙伴们会说,还好。;有一些刚开始学习源码的小伙伴们会说,太难了!。是的,不同工作履历不同技术条理的人的回答是不一样的。
那么刚开始学习开源项目源码难不难呢?应该对绝大部分小伙伴们来说应该是偏难的。为什么呢?大概有以下四点缘故起因
上篇文章《跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?》也说过优秀框架之间的思想都是互相借鉴的,这就是我们要学习源码的缘故起因之一。
3 该怎样入手去分析开源框架源码?

前面跟小伙伴们聊了阅读源码的难度,千万不要被吓慌了。伟大的毛主席说过,我们要在战略上藐视仇人 战术上重视仇人。不可否认,刚开始阅读某个开源项目的源码是有肯定的难度。注意,前面的用词是刚开始刚开始哈。也就是说如果我们坚持阅读源码的话,养成阅读源码是熏陶情操的习惯的话(网上看到的这句话,这里引用装装逼,嘿嘿),长期坚持下来再去阅读其他项目的源码,游刃有余不敢说,但肯定可以很快入手。
那么,我们该怎样入手去分析开源框架源码呢?
首先,结合前面所说的阅读源码之以是难的缘故起因,我们就要有针对性的去降服办理。比如有空多学学计划模式,算法和英语。这些软实力确实对阅读源码有很大帮助。
其次,阅读源码的前提是什么?固然,阅读源码是要建立在会使用的基础上,就像若还不会走路就学骑单车一样,若连用都不会就去研讨源码大概会适得其反。
最后,我们阅读源码要注意一些技巧,现在根据自身经历总结一下相关思路和技巧,如下:
举个栗子,比如Dubbo的模块分包核心的主要有以下八个,如下图,我们要知道最基础的的模块应该是dubbo-common公共逻辑模块,这个模块作为最基础的模块,主要是提供了通用模型和工具类;然后dubbo-remoting是远程通讯模块,依赖于dubbo-common模块,相当于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

作者: 落花131287865    时间: 2020-2-21 15:23
不错
作者: JasonLuo9015    时间: 2020-2-22 08:25
[祈祷]
作者: 广东大小事    时间: 2020-2-22 09:55
转发了
作者: cuizhihua    时间: 2020-2-24 10:51
转发了
作者: 世外桃源AT    时间: 2020-3-1 13:13
转发了
作者: 尘土2020    时间: 2020-4-2 18:32
转发了
作者: 井151276607    时间: 2020-4-2 20:35
“不过在初次调试源代码时值得注意的是一定要分清主次代码,即要先读主干代码,其他枝枝节节的代码没明白的可以放一边”请问:“初次调试……”,是在阅读代码吗?此时,能够分清主次吗?
作者: Banshee810    时间: 2020-4-18 18:49
收藏
作者: Banshee810    时间: 2020-4-18 18:49
转发了
作者: 蜗牛怪    时间: 2020-4-18 22:09
转发了
作者: 青松286069511    时间: 2020-5-1 06:49
转发了
作者: 叶扬尘123    时间: 2020-5-21 08:48
转发了
作者: Y笑喜    时间: 2020-6-9 10:22
转发了
作者: 汉堡哥哥哥    时间: 2020-9-20 15:15
转发了
作者: 小船掀大浪    时间: 2020-9-20 21:07
转发了
作者: 用户567348402099    时间: 2020-10-30 16:14
转发了
作者: 飞翔羽翼shine    时间: 2020-10-30 20:43
转发了
作者: 风暴L烈酒    时间: 2020-11-2 10:47
转发了
作者: wqlele_123    时间: 2020-11-3 07:03
转发了
作者: 乖乖小虎5870522    时间: 2020-12-19 18:34
转发了




欢迎光临 创意电子 (https://wxcydz.cc/) Powered by Discuz! X3.4