1. 程式人生 > >springmvc原始碼解讀1--關於原始碼解讀與部落格的書寫

springmvc原始碼解讀1--關於原始碼解讀與部落格的書寫

一、為何要閱讀原始碼

寫了太多了if|else,想要看看別人寫的程式碼如何,有一段時間看到一遍博文Java實現生命週期管理機制,當時就被這精妙的設計思想給蟄伏,同時也深深有感於它編碼風格,感覺這如同一件藝術品一般。講真的這是第一感覺編碼不知是隻有if|else以及curd。所以我開始想著去閱讀原始碼,最開始我閱讀的是mybatis,因為人都有習性,柿子撿軟的捏,後面也會寫相關的博文

二、如何閱讀原始碼:

首先你得找准入口,一般在配置檔案中都有。單也有例外那就是springboot,說實話要想讀它的原始碼有點困難,因為你需要從若干的程式碼中分析它的流程,這裡我們先不談,如果我們理解了spring 、springmvc的程式碼之後,在稍稍瞭解一下springboot的自動配置的原理再去讀它的原始碼也就不難了。

找准入口那只是第一步,找準介面後,我們就可以依據這個入口來畫出它的樹幹了,但是這裡我們先不要畫出葉子了(這個後面再說)。這個時候你就需要藉助於一些工具來輔助你完成你的這些工作。

三、閱讀原始碼:

  • 搭建環境:
    這裡我推薦大家使用簡單的方式,可以依據官方的github來把程式碼clone下來研究,也可以直接搭建一個專案環境,邊跑邊研究,這裡我經常使用的是後者。
  • 藉助於工具把框架的脈絡描繪出來:
    首先我們需要藉助於mindmanger這款工具把專案的大體骨架給描述出來,例如springmvc的八大元件。mybatis的四大元件等等。

    然後藉助於visio等uml工具把專案的執行的流程給畫出來,知道每個元件之間是如何分工協作的, 這個時候你就可以思考他們框架的構建方式了,對於我們以後的程式碼的邏輯組織還是有一定的幫助的

    到這個時候框架的整體脈絡和骨架已經呈現在我們面前的,這個時候才是我們專注於某一點進行定點突破的時候,我最開始在看mybatis的原始碼的時候,我通過debug一直從入口SqlSessionFactoryBuilde裡面的build(parser.parse());方法一直深入到配置檔案的各個節點的解析,然後在點下去直接到了ognl的部分了,後來我才發現不能這樣的搞,我們需要首先俯瞰這個原始碼,畫出骨骼脈絡之後,然後在逐一擊破。這個時候就需要我們使用類圖來來把相互之間的繼承關係給畫下來。

四、閱讀原始碼的過程中,我們需要的先決知識

  • 熟悉相關軟體的用法:mindmanager、uml(visio)、及編輯器(idea)
  • 熟悉設計模式(①:設計模式的原則;②:設計的應用以及變種)
  • 對框架的原理稍有理解
  • 對於java的反射註解有了解(這個幾乎是必須的)

五、原始碼閱讀的過程中,如何轉換輸出:

  • 原始碼閱讀的困擾:
    很多的時候我們也會零零散散的去看一些原始碼,看完老是忘怎麼辦。是的,這個問題是真真實實的存在的,但是你要知道初次看原始碼之後他的大體的流程大體的元件我們是知道的,如果在帶著問題去看我們會更加容易上手,所需要的時間將會大大降低,同時我們忘的是那些具體的程式碼,但是它的精華你是忘不了的,只有你研究的夠透徹,他會深入你之後所寫的程式碼之中的。
  • 針對經常忘怎麼辦:
    我們會把整個框架的點全部抽取到mindmanager裡面,這是一個把“書”便薄的過程,這個時候我們會寫部落格再把“書”給變回來。這樣就會加深我們的記憶。

六、對於寫部落格的一點見解:

  • 最開始寫部落格的原因:
    有一天我在學習rabbitmq,我通常學習東西的時候,我會找一個寫了一整個系列的文章去看,同時也會看官網的文件教程(google翻譯然後覺得句子不通在看英文,畢竟英文的閱讀速度有點慢),再看的過程中我發現有很多都是copy官放文件,一上來沒有場景的介紹,也沒有相關的介紹,直接上程式碼,甚至相關的引數都沒有介紹,有的博文雖然是一個系列,但是基本上是屬於博主邊學邊寫的缺乏系統性。

    同時我在學習東西的過程中總是會帶著疑問去學習,有時候會看到一些博文去講訊息的可靠性呀,於是我帶這個問題去研究,發現至今沒有一篇博文能完整的將這個問題給將透徹,同時我在遇到問題的時候,當時我加了兩個千人群,我把問題描述出來的時候,有人問我channel是什麼,我當時有點吃驚,他說他沒有使用過channel(他是直接整合的spring,然後spring有包裝過一層的),然後給他解釋了一下,這我就知道他們對這個問題不熟悉,同時在他們的問問中,我把這個問題描述了一下,然後他們都安靜了,也有私聊我的問題一些相關的東西的。

    在上面的過程中,我發現了我需要擴充套件我的交友的圈子(我之前也有朋友用過,但是他們也都不熟),如何把自己推銷出去呢,在這個時候部落格是最好的選擇。

    其實不僅僅是上面的原因,還有我也想的確寫點東西,把自己學習的整個過程記錄下來,但是我是在學完整個之後,回過頭來從新來整理然後才寫出來的。在寫之前我會把我所理解的應用場景或者是網上寫的好的相關的應用場景的介紹引用進來(我是直接掛的別人的部落格的連線,這樣應該不侵權吧,對這個不是太瞭解),然後才是相關的引數以及在應用的過程中所遇到的坑,同時有時也會結合一些原始碼來講。總的來說還是希望能遇到一群志同道合的朋友,一起學習一起進步。

  • 從寫部落格中得到了什麼:
    其實寫博文的過程中挺好玩的,把躺在mindmanager裡面的框框線條然後在通過發散在把這些東西輸出到部落格中,有些問題原來在研究的時候會跳過的,但是在寫部落格的過程中就會擔心,萬一大家問我這個問題怎麼辦,於是有老老實實的去看原始碼,去找相關的證據來佐證這個觀點。所以寫博文呢對於你的認識是一個昇華的過程,同時也是把你的知識系統化的一個過程。其實不要小看系統化,估計很多人也會像我之前一樣,平時沒事兒也喜歡看一些博文(synchronized、volatile的原理)看著看著好像自己真的知道了點什麼樣的,可是讓你講吧你又將不出來個所以然,後來我才發現這個其實是沒有一個系統化的過程。

以上只是個人的看法,如果有不同的意見探討可以留言或者加群一起探討交流