前言
有一段時間,我覺得我非要閱讀開放原始碼專案的原始程式不可。那時,我在公司負責設計和開發了很多系統。如果連大學時帶領大家開發和維護學校網站也算上的話,那我進行軟體開發已經整整十年了。在這十年裡,我對自己設計和開發的系統都很有信心,但有一個疑惑一直縈繞在我心頭:我不知道,我的架構和世界最優良架構之間的差距到底有多大。
閱讀開放原始碼專案的原始程式能給我答案。
許多優秀的開放原始碼專案歷經數千名開發者的數萬次提交,被數億使用者使用。這些專案從可擴充性、可靠性和可用性等各個角度考量,都是十分優良的。透過閱讀這些專案的原始程式,我能找到自己在軟體設計和開發上的不足。
於是我開始了我的原始程式閱讀計畫。
在閱讀原始程式的過程中,我看過不少資料。但很多資料對原始程式中簡單的部分說明得細緻入微,而對複雜的部分則避而不談或含糊其辭。在閱讀原始程式的過程中,我也走過不少彎路,經常在一個困難中掙扎很久不能前進。當然,閱讀原始程式也讓我收穫頗豐。它不僅讓我知道了自己的設計與優良設計之間的差距,還讓我學到了許多架構技巧和程式設計知識。
在原始程式閱讀的過程中,我也歸納出了許多經驗和方法。因此,我決定寫這本書,將經驗和方法分享出來,指引許多和我一樣前行在原始程式閱讀道路上的人。原始程式閱讀首先要選定對應的原始程式作為材料。從專案的成熟度、涉及面、應用廣度、專案規模等多方面考慮,本書最後選取MyBatis 原始程式。因此,本書將以閱讀MyBatis 原始程式為例,介紹原始程式閱讀的經驗和方法。
在本書的寫作中,我努力做到詳盡而不囉唆。本書以套件為單位,對MyBatis原始程式中的300 多個類別進行了介紹。在此過程中,對於簡單或重複的類別一筆帶過,但對於複雜的類別,則是逐方法、逐行地進行分析,力求讓大家讀得順、讀得懂、有收穫。
本書分為五篇,各篇主要內容如下。
第一篇為背景介紹,包含第 1 ∼ 4 章。
第1 章介紹了原始程式閱讀的意義和方法。
第2 章對MyBatis 的背景和快速上手方法進行了介紹。這一章的內容是簡單但重要的。對於任何一個軟體,其背景對應於軟體的「設計需求」,其使用對應於軟體的「主要功能」。把握一個軟體的設計需求和主要功能對於閱讀軟體的原始程式很有幫助。
第3 章中使用中斷點偵錯方法對MyBatis 的執行過程進行了追蹤。該章內容有助我們了解整個MyBatis 的內部架構。
第4 章對MyBatis 原始程式結構進行了介紹,並根據原始程式套件的功能對套件進行了分類。
第二篇為基礎功能套件原始程式閱讀,包含第 5 ∼ 11 章。
在這一篇中,我們對基礎功能套件中的原始程式進行了閱讀。基礎功能套件相對獨立,與MyBatis 的核心邏輯耦合小,比較適合作為原始程式閱讀的切入點。在閱讀這些原始程式時,我們也會逐步介紹一些閱讀原始程式常用的方法和技巧。
第5 章介紹了exceptions 套件的原始程式,可以透過該套件了解MyBatis 的整個例外系統。
第6 章介紹了reflection 套件的原始程式。該套件基於反射提供了建立物件、修改物件屬性、呼叫物件方法等功能。這些功能在MyBatis 的參數處理、結果處理等環節都發揮了重要的作用。
第7 章介紹了annotations 套件與lang 套件的原始程式。這兩個套件中全是註釋類別。我們將透過對Java 註釋的學習詳細了解每個註釋類別的含義。最後,我們還透過原始程式分析了註釋類別如何在MyBatis 的執行中發揮作用。
第8 章介紹了type 套件的原始程式。透過這一章將了解MyBatis 如何組織和實現類型處理器,以完成對各種類類型資料的處理。
第9 章介紹了io 套件的原始程式。透過該套件將了解到MyBatis 如何完成外部類別的篩選和載入。
第10 章介紹了logging 套件的原始程式。logging 套件不僅為MyBatis 提供了記錄檔記錄功能,還提供了取得和記錄JDBC 中記錄檔的功能。透過這一章將了解這些功能的實現細節。
第11 章介紹了parsing 套件的原始程式。透過這一章將了解MyBatis 如何完成XML 檔案的解析。
第三篇為設定解析套件原始程式閱讀,包含第 12 ∼ 17 章。
第12 章介紹了設定解析相關類別的分類方法。設定解析相關類別可以按照類別的功能劃分為解析器類別和解析實體類別。
第13 章介紹了binding 套件的原始程式。該套件負責將SQL 敘述連線對映介面。
第14 章介紹了builder 套件的原始程式。該套件中的建造者基礎類別和工具類別為MyBatis 基於建造者模式建造物件提供了基礎。此外,該套件還完成了XML 檔案和註釋對映的解析工作。
第15 章介紹了mapping 套件的原始程式。該套件完成了SQL 敘述的處理、輸入參數的處理、輸出結果的處理等功能,並為MyBatis 提供了多資料庫支援的能力。
第16 章介紹了scripting 套件的原始程式。就是在這個套件中,複雜的SQL 節點被逐步解析為純粹的SQL 敘述,該章將詳細說明這一解析過程。
第17 章介紹了datasource 套件的原始程式。該套件包含了MyBatis 中與資料來源相關的類別,包含非池化資料來源、池化資料來源、資料來源工廠等。也正是透過該套件,MyBatis 完成了和資料庫的對接。
第四篇為核心操作套件原始程式閱讀,包含第 18 ∼ 24 章。
在這一篇中,將詳細介紹MyBatis 的核心操作套件。
第18 章介紹了jdbc 套件的原始程式。該套件僅使用六個類別便為MyBatis 提供了執行SQL 敘述和指令稿的能力。
第19 章介紹了cache 套件的原始程式。該套件向我們展示了MyBatis 如何使用裝飾器模式提供給使用者豐富的、可設定的快取,並且該章還從功能維度出發詳細介紹了MyBatis 的兩級快取機制。
第20 章介紹了transaction 套件的原始程式。該套件為MyBatis 提供了內部和外部的交易支援。
第21 章介紹了cursor 套件的原始程式。透過該套件,MyBatis 能將查詢結果封裝為游標形式傳回。
第22 章介紹了executor 套件的原始程式。executor 套件是MyBatis 中最為重要也是最複雜的套件。在這一章中,首先,以子套件為單位分別介紹了MyBatis 的主鍵自動增加功能、懶載入功能、敘述處理功能、參數處理功能、結果處理功能和結果集處理功能。然後,在此基礎上對MyBatis 中執行器的原始程式進行了閱讀。最後,介紹了MyBatis
中錯誤上下文的原始程式,了解MyBatis 如何及時地保留錯誤發生時的現場環境。
第23 章介紹了session 套件的原始程式。session 套件是一個對外介面套件,是使用者在使用MyBatis 時接觸最多的套件。
第24 章介紹了plugin 套件的原始程式。在該章中我們撰寫了一個外掛程式,然後透過原始程式詳細了解了MyBatis 外掛程式的實現原理及MyBatis 外掛程式平台的架構。
第五篇為歸納與展望,包含第 25、26 章。
第25 章對閱讀MyBatis 原始程式過程中的方法和技巧進行了歸納。
第26 章從專案的成熟度、涉及面、應用廣度和規模等角度綜合考量,為大家推薦了一些優秀的開放原始碼專案。學習完本書後,大家可以從這些專案中挑選一些進行原始程式閱讀。
原始程式閱讀畢竟是一個對知識廣度和深度都有較高要求的工作,為了大家能夠順利地閱讀MyBatis 的原始程式,我們會在很多章節之前先介紹該章節原始程式涉及的基礎知識。掌握這些基礎知識後再閱讀相關原始程式則會輕鬆很多。
受篇幅所限,書中只能列出部分MyBatis 原始程式。我們將完整的帶中文註釋的MyBatis 原始程式整理成了開放原始碼專案,供大家下載與參考,您可至本公司官網www.deepmind.com.tw/ 尋找本書並下載原始繁體中文程式碼。另原作者也提供了簡體中文程式碼於github
上,該簡體中文註釋的網址為:github.com/yeecode/MyBatisCN。
為了讓大家能更輕鬆地了解和掌握一些相對複雜的基礎知識,本書也準備了許多範例專案。繁體中文程式碼可到本公司官網www.deepmind.com.tw/
尋找本書並下載原始程式碼,本書的簡體中文範例程式也可以在github 上下載,網址為:github.com/yeecode/MyBatisDemo。
由於時間和水準有限,書中難免會有疏漏之處。您可以透過我的個人首頁與我取得聯繫並進行交流,在那裡也能看到我的最新專案。我的個人首頁網址為:yeecode.top。
透過閱讀本書,您將詳細了解MyBatis
中每一個類別的結構、原理和細節。但要注意,這只是我們閱讀本書的額外收穫。掌握原始程式閱讀的方法和技巧,並將這些方法和技巧應用到其他專案的原始程式閱讀工作、系統設計工作、軟體開發工作中,這才是閱讀本書的最後目的。原始程式閱讀是一項過程艱苦而結果可觀的工作。每一個潛心閱讀原始程式的開發者都值得尊敬,也希望本書能夠在您閱讀原始程式的過程中為您提供一些幫助,讓您多一些收穫。
加油!奮鬥路上的你和我。