日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

分析开源项目源码,我们该如何入手分析?(授人以渔)

發(fā)布時(shí)間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分析开源项目源码,我们该如何入手分析?(授人以渔) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??點(diǎn)擊上方?好好學(xué)java?,選擇?星標(biāo)?公眾號(hào)

重磅資訊、干貨,第一時(shí)間送達(dá) 今日推薦:牛人 20000 字的 Spring Cloud 總結(jié),太硬核了~

1 前言

?本文接上篇文章跟大家聊聊我們?yōu)槭裁匆獙W(xué)習(xí)源碼?學(xué)習(xí)源碼對(duì)我們有用? 嗎?,那么本篇文章再繼續(xù)跟小伙伴們聊聊源碼這個(gè)話題。

在工作之余開(kāi)始寫(xiě)SpringBoot源碼分析專(zhuān)欄前,跟小伙伴們聊聊“分析開(kāi)源項(xiàng)目源碼,我們?cè)撊绾稳胧址治?#xff1f;”這個(gè)話題,我們就隨便扯皮,反正是跟小伙伴們一起學(xué)習(xí)交流,沒(méi)必要太正式。

小伙伴們看完本文后,若有自己的源碼閱讀心得可以在下面進(jìn)行評(píng)論或私聊我進(jìn)行分享,讓我從小伙伴們身上GET多點(diǎn)源碼閱讀的一些技巧,嘿嘿。

2 學(xué)習(xí)開(kāi)源框架源碼到底難不難?

那么,先跟小伙伴們聊聊學(xué)習(xí)開(kāi)源框架源碼的感受,請(qǐng)問(wèn)你們認(rèn)為學(xué)習(xí)開(kāi)源框架源碼到底難不難?這是一個(gè)開(kāi)放的話題,可謂仁者見(jiàn)仁,智者見(jiàn)智。有一些開(kāi)源大牛們會(huì)說(shuō),So easy!;有一些有源碼閱讀習(xí)慣且工作多年的小伙伴們會(huì)說(shuō),還好。;有一些剛開(kāi)始學(xué)習(xí)源碼的小伙伴們會(huì)說(shuō),太難了!。是的,不同工作經(jīng)驗(yàn)不同技術(shù)層次的人的回答是不一樣的。

那么剛開(kāi)始學(xué)習(xí)開(kāi)源項(xiàng)目源碼難不難呢?應(yīng)該對(duì)絕大部分小伙伴們來(lái)說(shuō)應(yīng)該是偏難的。為什么呢?可能有以下四點(diǎn)原因

  • 一個(gè)能流行起來(lái)的成熟的開(kāi)源項(xiàng)目必定功能齊全,可擴(kuò)展,而功能齊全可擴(kuò)展的開(kāi)源項(xiàng)目必定很復(fù)雜,代碼量大。比如Spring5框架的源碼行數(shù)達(dá)到了六七十萬(wàn)行,SpringBoot的源碼行數(shù)達(dá)到了25萬(wàn)行左右,Dubbo和RocketMQ的源碼行數(shù)達(dá)到了10萬(wàn)行。一個(gè)成熟的開(kāi)源項(xiàng)目代碼量這么多,可以想象其有多復(fù)雜。

  • 閱讀源碼時(shí),我們有時(shí)候無(wú)法猜透源碼作者當(dāng)時(shí)編碼時(shí)的想法。因?yàn)樵趧傞_(kāi)始閱讀源碼的過(guò)程中,我們肯定會(huì)遇到很不懂的代碼,不知道作者為何這么寫(xiě),為何在這個(gè)位置寫(xiě)代碼,這些都是很正常的,因?yàn)楫?dāng)初作者為啥這么寫(xiě),可能是針對(duì)一些比較特殊的業(yè)務(wù)場(chǎng)景,或者為了某方面的性能等等,我們根本無(wú)法猜透。打個(gè)不太恰當(dāng)?shù)谋扔?#xff0c;閱讀源碼猜測(cè)作者的心思就像當(dāng)初遇到一個(gè)自己喜歡的姑娘,猜測(cè)她的心思一樣,比如猜測(cè)她喜歡什么,她的興趣愛(ài)好是什么。其實(shí)剛開(kāi)始閱讀源碼也一樣,有些地方我們一開(kāi)始是無(wú)法猜透作者的心思的。

  • 有些開(kāi)源框架可能集操作系統(tǒng)知識(shí),數(shù)據(jù)結(jié)構(gòu),算法和設(shè)計(jì)模式于一身。是的,優(yōu)秀的框架必定是集成了很多設(shè)計(jì)模式于一身,目前為止筆者還沒(méi)見(jiàn)過(guò)哪種流行的又沒(méi)有應(yīng)用設(shè)計(jì)模式的框架哈。比如很多框架運(yùn)用了單例模式,工廠模式,責(zé)任鏈模式,裝飾器模式和模板方法模式等,因?yàn)槭褂迷O(shè)計(jì)模式能讓框架易于擴(kuò)展。同時(shí),不乏一些框架應(yīng)用了一些操作系統(tǒng)層面的知識(shí),這一塊比較底層,相信很多學(xué)java的小伙伴沒(méi)接觸過(guò)。此外,開(kāi)源框架某些地方會(huì)用到數(shù)據(jù)結(jié)構(gòu)和算法,舉個(gè)栗子,比如Dubbo默認(rèn)有四種負(fù)載均衡策略,而每種策略又對(duì)應(yīng)一種算法,其中又?jǐn)?shù)RoundRobinLoadBalance負(fù)載均衡策略最復(fù)雜,一開(kāi)始實(shí)現(xiàn)RoundRobinLoadBalance負(fù)載均衡的方式并不太完美或者說(shuō)有bug,Dubbo也是重寫(xiě)過(guò)RoundRobinLoadBalance幾次,最終借鑒了Nginx的RoundRobinLoadBalance負(fù)載均衡算法

    上篇文章《我們?yōu)槭裁匆獙W(xué)習(xí)源碼...》也說(shuō)過(guò)優(yōu)秀框架之間的思想都是互相借鑒的,這就是我們要學(xué)習(xí)源碼的原因之一。

    這里好像扯的有點(diǎn)遠(yuǎn)了,總之這里要說(shuō)明的是閱讀優(yōu)秀框架是有一定難度的。

  • 有些開(kāi)源框架注釋太少也增加了閱讀源碼的難度。說(shuō)到開(kāi)源項(xiàng)目注釋,如果我們閱讀老外寫(xiě)的的框架源碼可能還好,一般都會(huì)有大量注釋,比如Spring框架,可以說(shuō)幾乎每個(gè)方法都有注釋,這個(gè)就給我們閱讀源碼起了很大的幫助。不過(guò)唯一不好的可能就是英文注釋,閱讀對(duì)英語(yǔ)有一定的要求。其實(shí)英文注釋還好,遇到不懂的,百度翻一下就好了。其實(shí)比較頭疼的就是一些國(guó)內(nèi)優(yōu)秀的開(kāi)源框架,其注釋可以說(shuō)是很少的,這無(wú)疑大大增加了閱讀的難度,甚至有些框架的文檔也不齊全,那就更加GG了。

  • 3 該如何入手去分析開(kāi)源框架源碼?

    前面跟小伙伴們聊了閱讀源碼的難度,千萬(wàn)不要被嚇慌了。偉大的毛主席說(shuō)過(guò),我們要在戰(zhàn)略上藐視敵人 戰(zhàn)術(shù)上重視敵人。不可否認(rèn),剛開(kāi)始閱讀某個(gè)開(kāi)源項(xiàng)目的源碼是有一定的難度。注意,前面的用詞是剛開(kāi)始剛開(kāi)始哈。也就是說(shuō)如果我們堅(jiān)持閱讀源碼的話,養(yǎng)成閱讀源碼是陶冶情操的習(xí)慣的話(網(wǎng)上看到的這句話,這里引用裝裝逼,嘿嘿),長(zhǎng)期堅(jiān)持下來(lái)再去閱讀其他項(xiàng)目的源碼,游刃有余不敢說(shuō),但肯定可以很快入手。

    那么,我們?cè)撊绾稳胧秩シ治鲩_(kāi)源框架源碼呢?

    首先,結(jié)合前面所說(shuō)的閱讀源碼之所以難的原因,我們就要有針對(duì)性的去克服解決。比如有空多學(xué)學(xué)設(shè)計(jì)模式,算法和英語(yǔ)。這些軟實(shí)力確實(shí)對(duì)閱讀源碼有很大幫助。

    其次,閱讀源碼的前提是什么?當(dāng)然,閱讀源碼是要建立在會(huì)使用的基礎(chǔ)上,就像若還不會(huì)走路就學(xué)騎單車(chē)一樣,若連用都不會(huì)就去鉆研源碼可能會(huì)適得其反。

    最后,我們閱讀源碼要注意一些技巧,現(xiàn)在根據(jù)自身經(jīng)歷總結(jié)一下相關(guān)思路和技巧,如下:

  • 開(kāi)始閱讀源碼時(shí),先對(duì)框架的模塊及其關(guān)系有一個(gè)整體的認(rèn)識(shí)。我們要對(duì)框架項(xiàng)目的模塊和目錄要有一個(gè)全盤(pán)的了解,要知道每個(gè)模塊是干嘛的,然后要了解模塊與模塊之間的關(guān)系。

    舉個(gè)栗子,比如Dubbo的模塊分包核心的主要有以下八個(gè),如下圖,我們要知道最基礎(chǔ)的的模塊應(yīng)該是dubbo-common公共邏輯模塊,這個(gè)模塊作為最基礎(chǔ)的模塊,主要是提供了通用模型和工具類(lèi);然后dubbo-remoting是遠(yuǎn)程通訊模塊,依賴(lài)于dubbo-common模塊,相當(dāng)于Dubbo協(xié)議的實(shí)現(xiàn);而dubbo-rpc則是遠(yuǎn)程調(diào)用模塊,依賴(lài)于dubbo-remoting模塊,抽象各種協(xié)議,以及動(dòng)態(tài)代理;dubbo-cluster是集群模塊,依賴(lài)于dubbo-rpc模塊,將多個(gè)服務(wù)提供方偽裝為一個(gè)提供方,包括:負(fù)載均衡, 容錯(cuò),路由等。

  • 分析源碼先從父類(lèi)或父接口開(kāi)始分析。因?yàn)楦割?lèi)或者父接口往往代表了一類(lèi)功能,這些基類(lèi)或基類(lèi)接口往往抽象了各個(gè)具體子類(lèi)共有的屬性和行為,一些比較基礎(chǔ)的方法都在父類(lèi)中實(shí)現(xiàn),然后留個(gè)模板方法給子類(lèi)去實(shí)現(xiàn)即可(模板方法的應(yīng)用)。

    舉個(gè)栗子,這里還是拿Dubbo的負(fù)載均衡來(lái)說(shuō)吧,如下圖,LoadBalance是各種負(fù)載均衡策略的超級(jí)接口,定義了 select 方法用來(lái)實(shí)現(xiàn)選擇哪臺(tái)機(jī)器;然后AbstractLoadBalance是一個(gè)抽象類(lèi),實(shí)現(xiàn)了LoadBalance接口,在覆蓋了 select 方法后,其又增加了 calculateWarmupWeight 和 getWeight 權(quán)重相關(guān)的兩個(gè)方法,因?yàn)檫@些方法都跟具體的負(fù)載均衡策略類(lèi)有關(guān),故在父類(lèi)實(shí)現(xiàn)了。值得注意的是AbstractLoadBalance抽象類(lèi)的 select 方法中里留了個(gè)給子類(lèi)覆蓋的 doSelect 方法,具體的負(fù)載均衡策略將在doSelect中實(shí)現(xiàn)。

  • 閱讀源碼前首先要找到啟動(dòng)類(lèi)。閱讀分析源碼時(shí)要先從啟動(dòng)類(lèi)開(kāi)始,因此找到框架啟動(dòng)的入口很重要。

  • 閱讀源碼時(shí)要分清主干和枝節(jié)代碼。找到啟動(dòng)入口后,然后就可以順著啟動(dòng)入口一步一步調(diào)試來(lái)閱讀源碼了。不過(guò)在初次調(diào)試源碼時(shí)值得注意的是一定要分清主次代碼,即要先閱讀主干代碼,其他枝枝節(jié)節(jié)的代碼沒(méi)明白的可以放一邊。切忌一開(kāi)始就深入細(xì)節(jié)然后出不來(lái)了,這樣就會(huì)造成只見(jiàn)冰山一角而看不到全貌的感覺(jué)。

  • 閱讀源碼前要分清主次模塊。即閱讀分析源碼不能漫無(wú)目的,全盤(pán)通讀,我們要從我們平時(shí)有用到的模塊開(kāi)始分析。每個(gè)人的時(shí)間都很寶貴,我們要把時(shí)間花在刀刃上。比如SpringBoot增加的新特性中有自動(dòng)配置,而自動(dòng)配置特性又非常重要,因此可以挑選自動(dòng)配置來(lái)進(jìn)行源碼分析。

  • 要充分利用源碼項(xiàng)目的測(cè)試類(lèi)。之前也說(shuō)過(guò),一個(gè)框架之所以能流行,必定是經(jīng)過(guò)大量測(cè)試的。因此如果我們想具體了解某個(gè)類(lèi)和某個(gè)方法,我們可以充分利用這些測(cè)試類(lèi)來(lái)輔助我們?cè)创a分析。

  • 要學(xué)會(huì)一些調(diào)試技巧。這一點(diǎn)也很重要,比如在調(diào)試過(guò)程中如何查看調(diào)用關(guān)系等等,這里不多說(shuō),如何高效學(xué)習(xí)和閱讀源碼這篇文章中分享了大量調(diào)試的干活,小伙伴們可以瞅瞅。此外,還要學(xué)會(huì)有技巧的搜索源碼,說(shuō)到這里,下面舉個(gè)栗子。

    舉個(gè)Spring事件監(jiān)聽(tīng)的栗子。比如我們現(xiàn)在要知道哪個(gè)監(jiān)聽(tīng)器監(jiān)聽(tīng)了ContextRefreshedEvent事件,此時(shí)我們可以通過(guò)idea全局搜索"(ContextRefreshedEvent"關(guān)鍵字,得到以下截圖:從下圖可以看到spring-webmvc模塊的FrameworkServlet,spring-context模塊的ScheduledAnnotationBeanPostProcessor,和spring-jms模塊的JmsListenerEndpointRegistry等類(lèi)訂閱了ContextRefreshedEvent事件,那么在容器刷新的時(shí)候這幾個(gè)類(lèi)將會(huì)監(jiān)聽(tīng)到ContextRefreshedEvent事件,執(zhí)行一些初始化邏輯。

  • 8. 肯定還有大量的閱讀源碼技巧,希望本文能起到拋磚引玉的作用,期待小伙伴們可以留言分享下,讓筆者也收益一下。

    4 學(xué)習(xí)源碼,談實(shí)踐,論堅(jiān)持

    最后,我們學(xué)習(xí)源碼不是為了學(xué)習(xí)而學(xué)習(xí),最理想的效果我們要學(xué)以致用。比如把從源碼中學(xué)習(xí)到的設(shè)計(jì)模式,接口設(shè)計(jì)方法,面向?qū)ο笤瓌t和相關(guān)算法等等都可以應(yīng)用到我們手頭的項(xiàng)目中,這才是我們學(xué)習(xí)源碼的最終目的,也是源碼學(xué)習(xí)的最理想的效果。可能這里有些小伙伴會(huì)說(shuō),我平時(shí)參與的項(xiàng)目都是業(yè)務(wù)類(lèi)的項(xiàng)目,而不是開(kāi)發(fā)基礎(chǔ)框架,開(kāi)發(fā)中間件,CRUD比較多,可能學(xué)習(xí)基礎(chǔ)框架的源碼對(duì)我們用處很少。其實(shí)不是的,只要你有參與項(xiàng)目,學(xué)習(xí)源碼我們學(xué)習(xí)的是思想,我們就可以把源碼框架設(shè)計(jì)中的思想應(yīng)用到我們的項(xiàng)目中。

    最后的最后,我們來(lái)談?wù)?strong>堅(jiān)持,這是最難能可貴的。很多大道理我們都懂,比如要堅(jiān)持運(yùn)動(dòng),堅(jiān)持學(xué)習(xí),堅(jiān)持...,可是就是沒(méi)能堅(jiān)持下來(lái),包括我自己,嘿嘿。堅(jiān)持這東西太南了,不過(guò)還是應(yīng)該給自己立個(gè)flag吧,把自己有用到的框架比如SpringBoot,Spring,Mybatis,Dubbo,SpringCloud等框架源碼都閱讀分析一遍,加油,小伙伴們共勉!

    歡迎小伙伴們?cè)谠u(píng)論區(qū)補(bǔ)充源碼閱讀技巧哦,讓筆者GET多點(diǎn)技能,嘿嘿。

    若覺(jué)得文章不錯(cuò),歡迎關(guān)注本公眾號(hào),一起學(xué)習(xí)交流。

    參考:

    http://dubbo.apache.org/zh-cn/docs/dev/design.html

    總結(jié)

    以上是生活随笔為你收集整理的分析开源项目源码,我们该如何入手分析?(授人以渔)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 免费网站av | 97青草| 亚洲精品日韩精品 | 中文字幕爱爱 | 亚洲成人黄色在线观看 | 凹凸视频一区二区 | 男人天堂网站 | 色图av | 亚洲影院av | 性做久久久久久久免费看 | 中文字幕人成乱码熟女香港 | 操操操操操操 | 老熟妇一区二区三区 | 国产片淫乱18一级毛片动态图 | 岛国精品在线观看 | 青青青在线免费 | 懂色av蜜臀av粉嫩av分享吧 | av福利在线 | 久久影 | 长篇高h肉爽文丝袜 | 免费av在线 | 成年女人18级毛片毛片免费 | 亚洲www.| 国产精品8888 | 中文字幕国产一区 | 麻豆影视在线免费观看 | 国产一区二区三区四区视频 | 欧美日韩一区二区三区国产精品成人 | 十八禁视频网站在线观看 | www.99在线| 午夜视频在线瓜伦 | 亚洲三级av | 新版红楼梦在线高清免费观看 | 操大爷影院 | av高清在线观看 | 国产在线一卡二卡 | a天堂在线观看 | 中日韩免费视频 | 国产黄色一级片 | 制服.丝袜.亚洲.中文.综合懂色 | 亚洲一个色 | 国产乱淫av麻豆国产免费 | 日韩中文字幕一区二区三区 | www.中文字幕在线观看 | www.久热 | 亚洲成熟丰满熟妇高潮xxxxx | 欧美一级片免费看 | 中日韩av在线| 黑人巨大精品欧美一区二区免费 | 亚洲少妇一区 | 天堂v在线观看 | 亚洲精品视频91 | 成人片在线播放 | 国产99re | 免费看的av | 粉嫩精品久久99综合一区 | 久久99网| 久久亚洲精品中文字幕 | 国产福利免费视频 | 东北高大丰满bbbbzbbb | 狠狠躁日日躁夜夜躁2022麻豆 | 激情小说视频在线 | 久久久精品中文字幕麻豆发布 | 少妇视频一区二区三区 | 四虎综合网| 一级网站在线观看 | 亚洲一区视频网站 | 干日本少妇首页 | 在线免费三级 | 免费国产一区二区三区 | 大奶毛片| 欧美91在线| 久久久久久久久久久久久久av | 久草91| 国产黄色片免费 | 久久国产毛片 | 人体写真 福利视频 | 日韩伦理一区二区三区 | 夜夜骑狠狠干 | 亚洲人精品 | 女子spa高潮呻吟抽搐 | 精品无码久久久久久久久成人 | 国产精品一区二区无码对白 | 中文字幕 日韩有码 | 国产女主播喷水高潮网红在线 | 中国特级毛片 | 日本在线视频www | 色乱码一区二区三区熟女 | 欧美性猛交xxx乱久交 | 久久五月视频 | mm131美女大尺度私密照尤果 | 国产情侣露脸自拍 | 亚洲一二区在线 | 欧美激情在线观看 | 日本一级网站 | 中文字幕日韩一区二区三区不卡 | 日日狠狠| 黄色在线观看免费 | 每日在线更新av |