學這個原始碼專案,Java編碼能力提升3年?

語言: CN / TW / HK

作者:小傅哥
部落格:http://bugstack.cn
圖書:http://u.jd.com/4LapTH4

沉澱、分享、成長,讓自己和他人都能有所收穫!

一直都有一個非常好的硬核專案在你我身邊,複雜的架構、優秀的設計、強悍的實現。如果能跟著實現一遍,編碼能力至少提升3年!

spring-t2-02.png

這個專案就是 Spring 框架,你想過把它當成自己的專案手寫一遍嗎?


一、它是:技術頂峰

IOCAOPSPI,Spring 給你的不只是一個開發框架,還包括它的設計思想。它通過解耦 Bean 物件的例項化過程,管理 Bean 的生命週期,來維護你在程式開發中所需物件使用過程。讓你不需要刀耕火種般 new 一個物件,也不需要如 EJB 一樣笨重臃腫的開發維護,而像春風一樣潤物(萬物皆可Bean)細無聲的使用。因此可以說它完全擔得起 Java 技術設計的頂峰

除了運用以外,Spring 框架也是眾多碼農,最能最先接觸到的一個原始碼級複雜專案。任何初出新手村蛻變的碼農,尋覓苦找的鍛鍊專案,都不如學習 Spring 原始碼來的痛快。從架構設計的複雜、從分治抽象的運用、從設計模式的駕馭,Spring 框架都是頂級的,也是最能給你帶來豐富收穫的。

但學習 Spring 原始碼難嗎?難,難到程式設計個1-2年的研發,也不知道從哪下手學習。看到大部分資料和書籍也都是從一個知識點直接透析到骨頭。沒有閱讀原始碼經驗的小白,根本沒法如編寫者感同身受般學習,雲裡霧裡一樣的看,過眼雲煙一樣的忘。

為啥會這樣,因為 Spring 發展太久了,原始碼太大了,主幹核心原始碼外的繁枝末節有太多太多。就像沙發🛋左移套個套,套上蓋罩,罩上鋪塊小布料。但除了沙發以外的套、罩、布料對初學原始碼的研發來說,並沒有那麼重要。我要的就是最初的沙發,最開始的木板,看看它的結構,聞聞它的味道。

所以,如果你想真的把 Spring 這個原始碼級複雜框架的設計和實現精髓吸收嘍,就應該像開發一個專案一樣,跟著小傅哥寫一遍。只有這個專案是你寫的,你才能知道哪些細節是如何處理的,那些設計是如何駕馭的。

二、簡歷:學以致用

《手寫Spring》完成後我的能力如何體現到簡歷上?給個案例。

  1. 體現在專業技能上,例如; 1.1 深入學習 Spring 核心流程模組,包括;IOC、AOP、依賴倒置等流程,掌握Spring解決複雜場景所運用的分治、抽象和知識(設計模式、設計原則),在解決Spring場景問題時,可以從核心原理上給出方案。同時也具備基於 Spring 開發 SpringBoot Starter 技能,為複雜專案減少同類共性需求的開發,凝練通用的技術元件,減少研發成本。 1.2 深入學習 MyBaits 核心流程模組,包括;會話、反射、代理、事務、外掛等流程,熟練掌握 ORM 框架的設計思想、實現方式和應用價值。並能按需結合 MyBatis 的外掛機制,開發屬於企業自己所需的功能,包括;資料分頁、資料庫表路由、監控日誌、資料安全等方面。

  2. 體現在專案經驗上,例如;—— 對校招和實習比較有用 把 Spring、MyBatis 當一個學習專案來描述,這是你在離校前,最可能接觸到的一個完整的、成型的、知名的,有企業使用的,框架。你就按照自己學習並開發了這樣一個框架為目標來寫專案,並描述出這個專案,你用了什麼技術棧,解決了什麼問題,學習到了哪些。

  3. 體現在專案應用上,例如; 關於 Spring、MyBatis 的專案,一般都是外掛類開發,比如各類的 SpringBoot Starter,MyBatis 外掛,都是基於框架的深入整合類技術解決方案,體現在簡歷上,非常抓眼球。一看你就是有深度和自研能力的研發人員。—— 一般不讓你造輪子,但需要你有造輪子的能力,這樣企業中一些軟體可以被你進行優化和修改。

  4. 體現在解決問題是上,例如; 在你的自己的業務專案中,滲入一些關於解決了原專案使用 Spring 時,關於感知 Aware 方式或者結合 FactoryBean 包裝物件等,所遇到的問題,因為你學習過原始碼,所以非常清晰這樣的流程,因此解決了一個問題。通用 MyBatis 也適用於這樣的描述方式,包括;事務、查詢次數、批查詢、外掛能監聽到的四個類(ParameterHandler、ResultSetHandler、StatementHandler、Executor )你給了更好的選擇。

三、教你:駕馭原始碼

對於大部分使用 Spring 框架的研發人員來說,可能在遇到 Spring 框架的報錯提醒, 以及需要基於 Spring 框架開發 SpringBoot Starter 等技術類元件時,都會嘗試閱讀 Spring 框架的原始碼。由於 Spring 框架的原始碼龐大、複雜,也不像平常的業務流程程式碼開發一樣 具有分層結構,並且其中還使用了大量的設計模式,所以閱讀難度較大。研發人員很難釐清其中的呼叫鏈路和各個類之間的關係。

小傅哥在最初學習Spring時,也閱讀了不少關於 Spring 的圖書,在反覆學習後,仍然不能輕易理解 Spring 框架中各個功能的實現細節。其中一個原因是自己沒有手動實現,只閱讀了圖書,很難完全掌握 Spring 框架的精髓。

因此,小傅哥採用從零手寫 Spring 的方式,摒棄 Spring 原始碼中繁雜的內容,選擇整體框架中 的核心邏輯,簡化程式碼實現過程,保留核心功能,如 IOC、AOP、Bean 的生命週期、上下文、 作用域和資源處理、事務等。在開發過程中,細化功能模組,逐步完成一個簡單版的 Spring 框架。

在學習過程中,小傅哥對 Spring 框架有了非常深入的瞭解和認識,也體會了更多精妙的設計原則和設計模式。徹底從實現上搞清楚;上下文如何管理、Aware如何通過SPI機制處理感知物件通知、切面攔截如何設計、三級快取迴圈依賴如何實現、ORM框架怎麼整合到Spring等等。

所以,把關於手動實現簡單版 Spring 框架的內容編寫成書,希望可以幫助更多的研發人員學習 Spring 原始碼,編寫出有價值的原始碼設計方案。

四、推薦:一本好書

讀者在學習過程中,可以參考書中 Spring 框架地圖,通過全域性的視角,可以更好地理解和學習 Spring 框架的設計與開發。


若焰晨星,無量黎明。綻燃何須喧鬧,燦爛不懼寂寥。我就願意做一個心似平原走馬的人,也更享受那份安靜的執著。我也希望以我的經驗分享給這條路上的同好。—— @小傅哥