學這個源碼項目,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 框架的設計與開發。


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