那么,先跟小伙伴們聊聊學(xué)習(xí)開源框架源碼的感受,請(qǐng)問(wèn)你們認(rèn)為學(xué)習(xí)開源框架源碼到底難不難?這是一個(gè)開放的話題,可謂仁者見仁,智者見智。有一些開源大牛們會(huì)說(shuō),So easy!;有一些有源碼閱讀習(xí)慣且工作多年的小伙伴們會(huì)說(shuō),還好。;有一些剛開始學(xué)習(xí)源碼的小伙伴們會(huì)說(shuō),太難了!。是的,不同工作經(jīng)驗(yàn)不同技術(shù)層次的人的回答是不一樣的。
那么剛開始學(xué)習(xí)開源項(xiàng)目源碼難不難呢?應(yīng)該對(duì)絕大部分小伙伴們來(lái)說(shuō)應(yīng)該是偏難的。為什么呢?可能有以下四點(diǎn)原因:
有些開源框架可能集操作系統(tǒng)知識(shí),數(shù)據(jù)結(jié)構(gòu),算法和設(shè)計(jì)模式于一身。是的,優(yōu)秀的框架必定是集成了很多設(shè)計(jì)模式于一身,目前為止筆者還沒(méi)見過(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ò)。此外,開源框架某些地方會(huì)用到數(shù)據(jù)結(jié)構(gòu)和算法,舉個(gè)栗子,比如Dubbo默認(rèn)有四種負(fù)載均衡策略,而每種策略又對(duì)應(yīng)一種算法,其中又?jǐn)?shù)RoundRobinLoadBalance負(fù)載均衡策略最復(fù)雜,一開始實(shí)現(xiàn)RoundRobinLoadBalance負(fù)載均衡的方式并不太完美或者說(shuō)有bug,Dubbo也是重寫過(guò)RoundRobinLoadBalance幾次,最終借鑒了Nginx的RoundRobinLoadBalance負(fù)載均衡算法。
這里好像扯的有點(diǎn)遠(yuǎn)了,總之這里要說(shuō)明的是閱讀優(yōu)秀框架是有一定難度的。
前面跟小伙伴們聊了閱讀源碼的難度,千萬(wàn)不要被嚇慌了。不可否認(rèn),剛開始閱讀某個(gè)開源項(xiàng)目的源碼是有一定的難度。注意,前面的用詞是剛開始,剛開始哈。也就是說(shuō)如果我們堅(jiān)持閱讀源碼的話,養(yǎng)成閱讀源碼是陶冶情操的習(xí)慣的話,長(zhǎng)期堅(jiān)持下來(lái)再去閱讀其他項(xiàng)目的源碼,游刃有余不敢說(shuō),但肯定可以很快入手。
那么,我們?cè)撊绾稳胧秩シ治鲩_源框架源碼呢?
首先,結(jié)合前面所說(shuō)的閱讀源碼之所以難的原因,我們就要有針對(duì)性的去克服解決。比如有空多學(xué)學(xué)設(shè)計(jì)模式,算法和英語(yǔ)。這些軟實(shí)力確實(shí)對(duì)閱讀源碼有很大幫助。
其次,閱讀源碼的前提是什么?當(dāng)然,閱讀源碼是要建立在會(huì)使用的基礎(chǔ)上,就像若還不會(huì)走路就學(xué)騎單車一樣,若連用都不會(huì)就去鉆研源碼可能會(huì)適得其反。
最后,我們閱讀源碼要注意一些技巧,現(xiàn)在根據(jù)自身經(jīng)歷總結(jié)一下相關(guān)思路和技巧,如下:
開始閱讀源碼時(shí),先對(duì)框架的模塊及其關(guān)系有一個(gè)整體的認(rèn)識(shí)。我們要對(duì)框架項(xiàng)目的模塊和目錄要有一個(gè)全盤的了解,要知道每個(gè)模塊是干嘛的,然后要了解模塊與模塊之間的關(guān)系。
舉個(gè)栗子,比如Dubbo的模塊分包核心的主要有以下八個(gè),如下圖,我們要知道最基礎(chǔ)的的模塊應(yīng)該是dubbo-common公共邏輯模塊,這個(gè)模塊作為最基礎(chǔ)的模塊,主要是提供了通用模型和工具類;然后dubbo-remoting是遠(yuǎn)程通訊模塊,依賴于dubbo-common模塊,相當(dāng)于Dubbo協(xié)議的實(shí)現(xiàn);而dubbo-rpc則是遠(yuǎn)程調(diào)用模塊,依賴于dubbo-remoting模塊,抽象各種協(xié)議,以及動(dòng)態(tài)代理;dubbo-cluster是集群模塊,依賴于dubbo-rpc模塊,將多個(gè)服務(wù)提供方偽裝為一個(gè)提供方,包括:負(fù)載均衡, 容錯(cuò),路由等
分析源碼先從父類或父接口開始分析。因?yàn)楦割惢蛘吒附涌谕砹艘活惞δ?,這些基類或基類接口往往抽象了各個(gè)具體子類共有的屬性和行為,一些比較基礎(chǔ)的方法都在父類中實(shí)現(xiàn),然后留個(gè)模板方法給子類去實(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è)抽象類,實(shí)現(xiàn)了LoadBalance接口,在覆蓋了 select 方法后,其又增加了 calculateWarmupWeight 和 getWeight 權(quán)重相關(guān)的兩個(gè)方法,因?yàn)檫@些方法都跟具體的負(fù)載均衡策略類有關(guān),故在父類實(shí)現(xiàn)了。值得注意的是AbstractLoadBalance抽象類的 select 方法中里留了個(gè)給子類覆蓋的 doSelect 方法,具體的負(fù)載均衡策略將在doSelect中實(shí)現(xiàn)。
閱讀源碼前首先要找到啟動(dòng)類。閱讀分析源碼時(shí)要先從啟動(dòng)類開始,因此找到框架啟動(dòng)的入口很重要。
舉個(gè)Spring事件監(jiān)聽的栗子。比如我們現(xiàn)在要知道哪個(gè)監(jiān)聽器監(jiān)聽了ContextRefreshedEvent事件,此時(shí)我們可以通過(guò)idea全局搜索"(ContextRefreshedEvent"關(guān)鍵字,得到以下截圖:從下圖可以看到spring-webmvc模塊的FrameworkServlet,spring-context模塊的ScheduledAnnotationBeanPostProcessor,和spring-jms模塊的JmsListenerEndpointRegistry等類訂閱了ContextRefreshedEvent事件,那么在容器刷新的時(shí)候這幾個(gè)類將會(huì)監(jiān)聽到ContextRefreshedEvent事件,執(zhí)行一些初始化邏輯
最后,我們學(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ù)類的項(xiàng)目,而不是開發(fā)基礎(chǔ)框架,開發(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等框架源碼都閱讀分析一遍,加油,小伙伴們共勉!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前名稱:學(xué)習(xí)開源框架源碼到底難不難?-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://jinyejixie.com/article32/hispc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、商城網(wǎng)站、品牌網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、面包屑導(dǎo)航、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容