乾貨|新手也能看懂的源碼閱讀技巧

2020-12-14 酷扯兒

本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫

連結 :https://urlify.cn/ueQ7fy

前陣子,師長發了一波springboot源碼的專題,一共八篇,沒看過的可以先看看:

【原創】001 | 搭上 SpringBoot 自動注入源碼分析專車【原創】002 | 搭上 SpringBoot 事務源碼分析專車【原創】003 | 搭上基於 SpringBoot 事務思想實戰專車【原創】004 | 搭上 SpringBoot 事務詭異事件分析專車【原創】005 | 搭上 SpringBoot 請求處理源碼分析專車【原創】00 6| 搭上 SpringBoot 參數解析返回值處理源碼分析專車【原創】007 | 搭上 SpringBoot 攔截器源碼分析專車【原創】008 | SpringBoot 源碼專車總結(共8篇)但是俗話說,賣你魚不如教你打魚,有小白粉說,那新手有什麼閱讀源碼的技巧呢,這不,來了。

讀源碼的經歷

剛參加工作那會,沒想過去讀源碼,更沒想過去改框架的源碼;總想著別人的框架應該是完美的、萬能的,應該不需要改;另外即使我改了源碼,怎麼樣讓我的改動生效了?項目中引用的不還是沒改的jar包嗎。回想起來覺得那時候的想法確實挺……

工作了一年多之後準備跳槽了,開始了一輪的面試,其中有幾個面試官就問到了相關的源碼問題:ArrayList、HashMap的底層實現,spring、mybatis的相關源碼。問源碼的面試一般就是回去等消息,然後就沒然後了。

那時候開始意識到,源碼這東西在之前的工作的中感受不到,但是在面試中好像面的還挺頻繁的,從此有意識的開始了jdk部分源碼的閱讀(主要是集合)。一開始看源碼,看的特別糙,知道個大概,知道ArrayList的底層實現是數組,HashMap的底層是散列表(數組+鍊表);更深入一點的擴容、hash碰撞等等就不知道了。

讀spring源碼起於工作中遇到了一個問題(spring jdbcTemplate事務,各種詭異,包你醍醐灌頂!),排查一段時間最終是解決了,但過程讓我非常難受,各種上網查資料、各種嘗試,感覺就像大海撈針一樣,遙遙無期。我下定決心,我要看一看spring的源碼,於是我買了一本《spring源碼深度解析》,結合著這本書、打開著eclipse,開始了spring的源碼閱讀之旅。至此,讀源碼成了習慣,源碼已經進入了我的心裡。

後來,springboot的火熱,讓我也想蹭上一蹭,於是有了springboot的啟動源碼系列,雖然還在進行中,但是我相信我能將其完成;工作中用到了shiro,我又結合著《跟我學shiro》將shiro的源碼看了個大概,有了shiro源碼系列博文,還差一篇認證與授權(應該很快就能面世),shiro源碼系列就封筆了。最近在搭建自己的後臺管理系統,用到了quartz,集成的過程也遇到了一些問題,因此有了quartz的兩篇文章。

慢慢的,從一味的網上找資料變成了很多時候會從源碼中找答案。不求能讀太多的源碼,但願自己接觸的技術都能讀上一讀,路漫漫其修遠兮,吾將上下而求索!

我為什麼讀源碼

很多人一定和我一樣的感受:源碼在工作中有用嗎?用處大嗎?很長一段時間內我也有這樣的疑問,認為哪些有事沒事扯源碼的人就是在裝,只是為了提高他們的逼格而已。

那為什麼我還要讀源碼呢?一剛開始為了面試,後來為了解決工作中的問題,再後來就是個人喜好了。說的好聽點是有匠人精神;說的委婉點是好奇(底層是怎麼實現的);說的不自信點是對黑盒的東西我用的沒底,怕用錯;說的簡單直白點是提升自我價值,為了更高的薪資待遇(這裡對真正的技術迷說聲抱歉)。

源碼中我們可以學到很多東西,學習別人高效的代碼書寫、學習別人對設計模式的熟練使用、學習別人對整個架構的布局,等等。如果你還能找出其中的不足,那麼恭喜你,你要飛升了!會使用固然重要,但知道為什麼這麼使用同樣重要。從模仿中學習,從模仿中創新。

讀源碼不像圍城(外面的人想進來,裡面的人想出去),它是外面的人不想進來,裡面的人不想出去;當我們跨進城內,你會發現(還是城外好,皮!)城內風光無限,源碼的海洋任我們遨遊!

我是怎麼樣讀源碼的

內容了解

首先我們要對我們的目標有所了解,知道她有什麼特點,有些什麼功能。對對方都還不了解,就想著進入別人的內心世界,那不是臭不要臉嘛,我們要做一個有著流氓心的紳士;對她有個大致的了解了,就可以發起攻勢,一舉拿下。

那麼怎麼樣了解了,方式有很多,我這裡提供幾種,僅供參考

最好的方式就是官方參考指南,親生父母往往對孩子是最了解的,對孩子的描述也是最詳細的;比如Spring Boot Reference Guide就是對springboot最詳細的描述,怎麼樣使用springboot、springboot特性等等,通過此指南,springboot在你面前一覽無遺;

但是,springboot畢竟是外國人的孩子,如果英語不好,估計讀起來有點頭疼了,不過我們有google翻譯呀,咬咬牙也是能看的。源碼世界的丈母娘、老嶽丈是非常慷慨的!

其次是書籍,國外優秀的有很多,國內也不乏好書,比較推薦此方式,自成體系,讓我們掌握的知識點不至於太散。這就是好比是源碼的閨蜜,對源碼非常了解,重點是挺大方,會盡全力幫助我們了解源碼。

再次就是博客,雖然可能覺得知識點比較散,但是針對某個知識點卻特別的細,對徹底掌握非常有幫助,園子內就有很多技術大牛,寫的博客自然也是非常棒,非常具有學習價值。當然還有社區、論壇、github、碼雲等等。這就是源碼的朋友圈,我們從中也能獲取到非常多關於源碼的信息。

設計模式的了解

優秀的框架、技術從不乏設計模式;jdk源碼中就應用了很多設計模式,比如IO流中的適配器模式與裝飾模式、GUI的觀察者模式、集合中的迭代器模式等等;spring源碼中也是用到了大量的設計模式。設計模式有什麼優點、各適用於什麼場景,不是本文的內容,需要我們大家自行去了解。

我們只需要對一些常用的設計模式有個大致了解,再去讀源碼是比較好的;不需要將23種設計模式都通讀,也不需要將常用設計模式完全理解透;對於全部通讀,我們時間有限,另外有些模式確實不太好理解、用的少,性價比不高,沒必要全部都讀。

推薦書籍:《Head First Design Patterns》(中文版:《Head First 設計模式》)、《Java與模式》;

另外我比較推薦的一種學習設計模式的方式是讀別人博客:java_my_life,劉偉技術博客,chenssy的設計模式;

設計模式之於源碼,就好比逛街購物之於女人,想順利勾搭源碼,我們需要好好掌握設計模式這個套路。

配合ide進行斷點追蹤

我們通過源碼的圈子對源碼的了解終究只是停在表面,終究還是沒有走進她的內心,接下來我就和大家分享下,我是如何走進她的內心的!

相信看過我的源碼博客的小夥伴都知道,我非常喜歡通過idea斷點來進行源碼追蹤,斷點追蹤源碼是我非常推薦的一種方式。斷點不僅可以用來調試我們的代碼,也可以用來調試我們用到的框架源碼。

面對未知的、茫茫多的源碼,我們往往沒有足夠的時間、經歷和耐心去通讀所有源碼,我們只需要去讀我們關注的部分即可(有人可能會說我都不關心,這…)。那為什麼要用斷掉調試的方式來跟源碼,而不是直接從原始碼入手去跟我們關注的部分呢?

嘗試過的小夥伴應該知道,如果我們對源碼不熟悉,直接通過源碼的方式去跟,一方面很容易迷路(多態,會有很多子類實現),不知道接下來跟哪一個,另一方面也很容易跟丟,當我們跟入的很深的時候,很有可能就忘記上一步跟到哪了。

下面我會舉例來說明我是如何進行斷點追蹤的,以spring-boot-2.0.3之quartz集成,不是你想的那樣哦!和 spring-boot-2.0.3之quartz集成,數據源問題,源碼探究 為背景來講,需要搞清楚兩個點:springboot是如何向quartz注入數據源的,quartz是如何操作資料庫的

springboot向quartz注入數據源

QuartzAutoConfiguration是springboot自動配置quartz的入口

將quartz的配置屬性設置給SchedulerFactoryBean;將數據源設置給SchedulerFactoryBean:如果有@QuartzDataSource修飾的數據源,則將@QuartzDataSource修飾的數據源設置給SchedulerFactoryBean,否則將應用的數據源(druid數據源)設置給SchedulerFactoryBean,顯然我們的應用中沒有@QuartzDataSource修飾的數據源,那麼SchedulerFactoryBean中的數據源就是應用的數據源;將事務管理器設置給SchedulerFactoryBean。SchedulerFactoryBean,負責創建和配置quartz Scheduler,並將其註冊到spring容器中。SchedulerFactoryBean實現InitializingBean的afterPropertiesSet方法,裡面有可以設置數據源的過程

可以看到通過org.quartz.jobStore.dataSource設置的dsName(值為quartzDs)最後會被替換成springTxDataSource.加scheduler實例名(我們的應用中是:springTxDataSource.quartzScheduler)。springboot會註冊兩個ConnectionProvider給quartz:一個dsName叫springTxDataSource.quartzScheduler,有事務;一個dsName叫springNonTxDataSource.quartzScheduler,沒事務。

quartz如何操作資料庫

我們通過停止定時任務來跟下quartz對資料庫的操作

發現quartz用如下方式獲取connection

conn = DBConnectionManager.getInstance().getConnection(getDataSource());

那麼我們的job中就可以按如下方式操作資料庫了

public class FetchDataJob extends QuartzJobBean {// private String dataSourceName = "quartzDs"; // 用此會找不到 // private String dataSourceName = "springNonTxDataSource.quartzScheduler"; // 不支持事務 // private String dataSourceName = "springTxDataSource.quartzScheduler"; // 支持事務 private final String insertSql = "INSERT INTO tbl_sys_user(name, age) VALUES(?,?) "; private String schedulerInstanceName = "quartzScheduler"; // 可通過jobDataMap注入進來 @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { String dsName = LocalDataSourceJobStore.NON_TX_DATA_SOURCE_PREFIX + schedulerInstanceName; // 不支持事務 //String dsName = LocalDataSourceJobStore.TX_DATA_SOURCE_PREFIX + schedulerInstanceName; // 支持事務 try { Connection connection = DBConnectionManager.getInstance().getConnection(dsName); PreparedStatement ps = connection.prepareStatement(insertSql); ps.setString(1, "張三"); ps.setInt(2, 25); ps.executeUpdate(); ps.close(); connection.close(); // 將連接歸還給連接池 System.out.println("插入成功"); } catch (SQLException e) { e.printStackTrace(); } } public void setSchedulerInstanceName(String schedulerInstanceName) { this.schedulerInstanceName = schedulerInstanceName; }}

明確我們的目的,找到合適的切入點,進入斷點調試追蹤也就容易了。

任我說的天花亂墜,你仍無動於衷,那也只是我一廂情願,只有局中人才能體會到其中的奧妙!

總結與感悟

從上至下全部通讀的方式,個人不太推薦,這是建立在很熟悉的基礎上的,當我們對某個框架已經比較熟悉了,再從上至下進行通讀,徹底了解,這是我認為正確的方式;但是從不熟悉到熟悉這個過程,個人不推薦全部通讀,而是推薦上面我推薦的方式 - 斷點局部追蹤。

很多時候,我們的博文都只是授之以魚,而我們也只是從中得到魚;而這篇的目的則是授之以漁,我希望大家從中學到捕魚的方法,而不是一味的等待別人的魚;希望大家能夠自給自足,也能把魚和漁都授予其他人。

只要我們開始去讀源碼,慢慢的就會形成自己的一套讀源碼的方式;每個人的方式都不一樣,合適自己的才是最好的。行動起來,用合適的方式去俘獲你的的她吧!

相關焦點

  • 源碼不止Spring!阿里首推源碼成長筆記,深入底層不再蒙圈
    那麼該如何高效閱讀源碼,理解其中的思維邏輯?不要急,今天小編為大家整理了兩份阿里大牛純手打源碼筆記以及配套視頻資源,大家看了就知道,差距不止一點點!需要的小夥伴幫忙評論+轉發,關注我之後直接私信【666】即可獲取!
  • 拍冬天的6個萬能技巧,用9張照片解說,攝影新手也能看懂學會
    萬能技巧,例圖解說。 舉一反三,不要畏縮。 多多練習,大膽拍攝! 拍冬天的6個萬能技巧,用9張照片具體解說,攝影新手也能看懂學會: 這些技巧,並不局限於用於下面場景,而是多種生活場景都可使用!所以稱為萬能!
  • 看到Mybatis源碼就感到煩躁,怎麼辦?
    看源碼是需要技術支撐的,不是隨便一個小白也能看懂的。沒有一些技術支撐,你頂多看看一小段,然後就看不下去,於是就放棄了。缺乏正確心態。看源碼確實挺無聊的,如果大家心態沒放好,把它當做一種任務去做,肯定覺得無聊,而且很容易放棄。缺乏足夠時間。
  • 新手小白零基礎看圖解,乾貨教程
    全是乾貨,建議收藏:教你看懂鉤針花樣圖解之前小編發圖解時,經常有愛好鉤針的小夥伴在下面留言,說看不太懂圖解。於是,今天找來了一些鉤針圖解的基本符號的教學,想學編織又苦惱於看不懂圖解的小夥伴們,敲黑板啦,接下來可是純乾貨哦!
  • 品牌營銷新媒體運營公眾號爆款文章軟文內容創作廣告文案寫作撰寫策劃新手小白從零基礎如何開始學習技巧攻略方法實戰乾貨攻略教學課程下載
    mcn運營管理技巧經驗學習乾貨攻略方法分享下載這店才是今年最後王炸!小白家精美壁紙 | 生日文案+生日正能量文字配圖抖音快手知乎小紅書公眾號新媒體營銷網際網路運營品牌營銷策劃工作流程sop計劃方案表格模板新手小白從零基礎怎麼入門教學技巧幹貨經驗文案小白成長記?
  • 乾貨推薦:理財小白也能看懂的理財小說,強推《無線破產危機》
    這本小說是理財小白也能看懂的理財金融類小說,當然,小說中也有主角的感情線,不過稍後。文案簡介:金融大佬雲珞在線指導幫助破產人群脫貧致富,實現人生逆襲。女主是系統「雲珞」,而不是宿主。閱讀難度從低到高,但不是長篇,全文共64章,建議大家閱讀正版書籍(晉江文學城),除開正文,「作話」裡面也有科普知識,大家不要錯過。看的時候不要急著動手,最好看完全文再統一規劃。正版全文買下來也不過4塊多,我買了,這還不夠一杯奶茶的錢卻能收穫理財乾貨,親們,買不了吃虧,買不了上當,大家衝鴨!
  • 《破壞領主》新手攻略技巧心得分享 新手要注意什麼?
    破壞領主新手要注意什麼?有些萌新玩家在進入遊戲不知道要做些什麼,為了便於大家更好的體驗遊戲,小編這裡給大家帶來了破壞領主新手攻略技巧心得分享,一起來看下吧。
  • 艾普環球:看懂外匯行情之實戰技巧分享
    當踏入外匯市場,首先必須掌握的知識就是要能夠看懂市場行情,只有對市場實時動態做出正確的分析,才能選擇對應的策略。艾普環球小編對於新手如何才能看懂外匯行情整理了一些方法,希望可以幫助新手外匯投資者開拓思路。  1、從基本面進行外匯行情分析  要做外匯行情分析,我們可以先從基本面入手。從基本面分析貨幣對,即為分析貨幣所在經濟體,通過其政治、經濟等情況來判斷其匯價走勢。
  • 聽HiFi專業的App,VIPER獨佔USB源碼輸出發燒友用過都上癮
    筆者也試錯了很久,直到在一次偶然的機會下接觸到一款自帶煲機功能及獨佔USB模式的VIPER HiFi APP,發現它算是目前無損曲庫最大、上手難度比較低、新手也可以玩得溜的手機HiFi軟體。作為HiFi圈內很重要的一項學問,根據筆者的體驗來說,煲機確實能在一定程度上改善耳機的性能,但煲機需要在合適頻率、音量的音樂結合正確的操作方法下完成,才能在不損傷硬體的同時讓振膜加速成熟,這門「玄學」並不簡單。然而,現在很多手機HiFi APP在這方面為用戶提供的幫助幾乎為零,新人除了靠自己摸索,就只能去請教資深發燒友。
  • 3D列印筆繪畫技巧,新手入門指南,硬核乾貨!魔法貓免費分享
    孩子怎麼樣才能輕鬆掌握3D列印筆的使用技巧,快速上手,Magic Cat魔法貓3D繪畫筆為您分享滿滿的實操乾貨分享!話不多說,硬核分享馬上開始:一、3D模型製作過程中的要點1.仔細閱讀魔法貓3D列印筆使用說明書,正確使用列印筆,如剪齊料口、停止繪畫後及時退出材料等,以延長使用壽命,注意使用安全;2. 下筆前,先拿出一個繪畫的實物/圖片參照,讓孩子觀察,主動分析,物品由什麼組成,有什麼特點,建議家長陪同;3.
  • 觸漫用戶大神分享創作乾貨 輕鬆帶你領略創作快樂
    在二次元交流平臺上,除了聊動漫之外,交流繪畫技巧也十分地受歡迎。觸漫作為擁有4500萬00後用戶的泛二次元創作社區,一直都非常鼓勵用戶開展創作方面的交流;同時,平臺存在著大量優秀畫師,熱情地分享動漫創作相關的乾貨,跟一群喜歡二次元的朋友們交流經驗,互幫互助,社區濃厚的學習氛圍和諧而有愛。
  • 那些適合新手小白投稿的公眾號
    前兩天答應要為你們整理出這篇投稿純乾貨三 乾貨一和乾貨二都在歷史文章中,需要的話關注我們,回復關鍵字「投稿」即可查看。 以下這篇為純乾貨,建議收藏轉發。
  • 分享16個聲音類兼職副業(純乾貨,值得閱讀,適合新手)
    保證是全網最全的純乾貨分享了,記得點讚加關注,別用的時候找不到了。開始進入正文嘍,下面是聲音類兼職的渠道和方法,認真看哦!這樣的APP有:1、喜馬拉雅FM,下載到手機,然後註冊帳號—-點擊登錄—-點開個人中心裡的創作中心—-我要賺錢—-找到有聲化平臺—-裡面會有非常多的配音任務,大量的小說和文章需要配音,一個任務大概是50~100,如果有打賞的話能收益得更多,但是需要等級到5級才可以申請。
  • 零基礎怎麼看懂機械零件圖?簡單看懂機械圖5大技巧,你別錯過!
    機械,建築圖紙最為工程最基礎,也是最重要的參考,想要將圖紙內容變為現實建築,必須要看懂這些建築圖紙,應該怎麼看呢?零基礎想要快速的看懂建築機械工程圖?是不是也想要練就拿到施工圖就能夠明確看懂圖紙內容本領!但是怎麼都看不懂?怎麼辦?
  • 《Darksburg》新手怎麼玩 新手入門技巧
    導 讀 Darksburg新手有哪些實用技巧?
  • 開課吧雙十二教育節:助力學員輕鬆掌握Spring AOP源碼
    近年來,Spring AOP源碼已然成為國內網際網路大廠面試JAVA程式設計師必問問題。想要進入網際網路大廠的Java程式設計師,生澀難懂的Spring AOP源碼是一個繞不過去的坎。開課吧的「面試官最愛問的Spring AOP源碼全解析訓練營」,非常適合使用過Spring框架的小夥伴以及想要輕鬆進入網際網路大廠的JAVA程式設計師。
  • 陰陽師新手乾貨分享 想做大佬必不可少
    小編給大家的第一個建議就是,剛開始先遠離大佬。 以上就是18183小編給大家帶來的陰陽師新手乾貨分享。 以上就是18183為大家帶來的陰陽師攻略!更多陰陽師消息請繼續關注18183。 還有陰陽師多款精美皮膚、SSR式神和魂玉禮包正在發放,可以使用微信掃描下方二維碼領取。
  • 乾貨│ Vlog技巧大揭秘,小白也能拍大片噢!
    今天圖圖就為大家分享8種運鏡手法——運鏡有8種「必殺級」技巧,分別是:推、拉、搖、移、跟、甩、升、降。結尾至於結尾專業的可以做個片尾/字幕啥的如果偷懶的話直接說明一下也可以啦後期主要是指剪輯軟體的運用現在的手機剪輯軟體一大堆圖圖推薦幾款給大家~特點:1.VUE的頁面簡潔大方,是新手入門很好用的編輯工具。2.有原創vlog平臺交流。
  • 《荒野亂鬥》新手怎麼玩 新手實戰技巧教學
    對於新手來說實戰運用到的技巧還是太少,看完小編給大家帶來的這篇荒野亂鬥新手實戰技巧分享,希望各位看完都能得到幫助。 荒野亂鬥新手實戰技巧有哪些 1、大部分模式都需要... 荒野亂鬥新手實戰技巧有哪些?
  • 《PartyAnimals》怎麼玩 新手入門技巧教學
    導 讀 Party Animals這款人類一敗塗地類型的玩法,很多新手玩家加入其中,那麼新手需要注意什麼