那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你想好入城了嗎?告訴你我是怎么樣讀源碼的

5RJg_mcuworld ? 來源:lp ? 2019-04-11 09:12 ? 次閱讀

剛參加工作那會,沒想過去讀源碼,更沒想過去改框架的源碼;總想著別人的框架應(yīng)該是完美的、萬能的,應(yīng)該不需要改;另外即使我改了源碼,怎么樣讓我的改動生效了? 項目中引用的不還是沒改的jar包嗎?;叵肫饋碛X得那時候的想法確實挺......

工作了一年多之后準(zhǔn)備跳槽了,開始了一輪的面試,其中有幾個面試官就問到了相關(guān)的源碼問題:ArrayList、HashMap的底層實現(xiàn),spring、mybatis的相關(guān)源碼。問源碼的面試一般就是回去等消息,然后就沒然后了。那時候開始意識到,源碼這東西在之前的工作的中感受不到,但是在面試中好像面的還挺頻繁的,從此有意識的開始了jdk部分源碼的閱讀(主要是集合)。一開始看源碼,看的特別糙,知道個大概,知道ArrayList的底層實現(xiàn)是數(shù)組,HashMap的底層是散列表(數(shù)組+鏈表);更深入一點的擴容、hash碰撞等等就不知道了。

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

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

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

我為什么讀源碼

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

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

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

讀源碼不像圍城(外面的人想進(jìn)來,里面的人想出去),它是外面的人不想進(jìn)來,里面的人不想出去;當(dāng)我們跨進(jìn)城內(nèi),你會發(fā)現(xiàn)(還是城外好,皮!)城內(nèi)風(fēng)光無限,源碼的海洋任我們遨游!

你想好入城了嗎?我是怎么樣讀源碼的

內(nèi)容了解

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

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

最好的方式就是官方參考指南,親生父母往往對孩子是最了解的,對孩子的描述也是最詳細(xì)的;比如Spring Boot Reference Guide就是對springboot最詳細(xì)的描述,怎么樣使用springboot、springboot特性等等,通過此指南,springboot在你面前一覽無遺;但是,springboot畢竟是外國人的孩子,如果英語不好,估計讀起來有點頭疼了,不過我們有g(shù)oogle翻譯呀,咬咬牙也是能看的。源碼世界的丈母娘、老岳丈是非常慷慨的!

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

再次就是博客,雖然可能覺得知識點比較散,但是針對某個知識點卻特別的細(xì),對徹底掌握非常有幫助,園子內(nèi)就有很多技術(shù)大牛,寫的博客自然也是非常棒,非常具有學(xué)習(xí)價值。當(dāng)然還有社區(qū)、論壇、github、碼云等等。這就是源碼的朋友圈,我們從中也能獲取到非常多關(guān)于源碼的信息。

設(shè)計模式的了解

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

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

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

常用設(shè)計模式:單例模式、工廠模式、適配器模式、裝飾模式、外觀模式、代理模式、迭代器模式、觀察者模式、命令模式

另外我比較推薦的一種學(xué)習(xí)設(shè)計模式的方式是讀別人博客:java_my_life,劉偉技術(shù)博客,chenssy的設(shè)計模式;

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

配合ide進(jìn)行斷點追蹤

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

相信看過我的源碼博客的小伙伴都知道,我非常喜歡通過idea斷點來進(jìn)行源碼追蹤,斷點追蹤源碼是我非常推薦的一種方式。斷點不僅可以用來調(diào)試我們的代碼,也可以用來調(diào)試我們用到的框架源碼。面對未知的、茫茫多的源碼,我們往往沒有足夠的時間、經(jīng)歷和耐心去通讀所有源碼,我們只需要去讀我們關(guān)注的部分即可(有人可能會說我都不關(guān)心,這...)。那為什么要用斷掉調(diào)試的方式來跟源碼,而不是直接從源代碼入手去跟我們關(guān)注的部分呢?嘗試過的小伙伴應(yīng)該知道,如果我們對源碼不熟悉,直接通過源碼的方式去跟,一方面很容易迷路(多態(tài),會有很多子類實現(xiàn)),不知道接下來跟哪一個,另一方面也很容易跟丟,當(dāng)我們跟入的很深的時候,很有可能就忘記上一步跟到哪了。

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

springboot向quartz注入數(shù)據(jù)源

QuartzAutoConfiguration是springboot自動配置quartz的入口

quartz的配置屬性設(shè)置給SchedulerFactoryBean;將數(shù)據(jù)源設(shè)置給SchedulerFactoryBean:如果有@QuartzDataSource修飾的數(shù)據(jù)源,則將@QuartzDataSource修飾的數(shù)據(jù)源設(shè)置給SchedulerFactoryBean,否則將應(yīng)用的數(shù)據(jù)源(druid數(shù)據(jù)源)設(shè)置給SchedulerFactoryBean,顯然我們的應(yīng)用中沒有@QuartzDataSource修飾的數(shù)據(jù)源,那么SchedulerFactoryBean中的數(shù)據(jù)源就是應(yīng)用的數(shù)據(jù)源;將事務(wù)管理器設(shè)置給SchedulerFactoryBean。SchedulerFactoryBean,負(fù)責(zé)創(chuàng)建和配置quartz Scheduler,并將其注冊到spring容器中。SchedulerFactoryBean實現(xiàn)InitializingBean的afterPropertiesSet方法,里面有可以設(shè)置數(shù)據(jù)源的過程。

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

quartz如何操作數(shù)據(jù)庫

我們通過停止定時任務(wù)來跟下quartz對數(shù)據(jù)庫的操作

發(fā)現(xiàn)quartz用如下方式獲取connection

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

那么我們的job中就可以按如下方式操作數(shù)據(jù)庫了

View Code

明確我們的目的,找到合適的切入點,進(jìn)入斷點調(diào)試追蹤也就容易了。

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

總結(jié)與感悟

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

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 適配器
    +關(guān)注

    關(guān)注

    8

    文章

    1976

    瀏覽量

    68264
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    652

    瀏覽量

    29458
  • 模式
    +關(guān)注

    關(guān)注

    0

    文章

    65

    瀏覽量

    13432

原文標(biāo)題:學(xué)會讀源碼,很重要!

文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ade7753想要讀取電流、電壓、功率、電能,直接寄存器就行了嗎?

    想要讀取電流、電壓、功率、電能。直接寄存器就行了嗎? 相位、增益誤差方面的內(nèi)容怎么進(jìn)行設(shè)置?
    發(fā)表于 12-25 07:59

    你我

    你我的事
    發(fā)表于 02-28 18:32

    【微信精選】學(xué)源碼居然和追女孩子是同一回事!這個解釋不得不服

    會發(fā)現(xiàn)(還是城外好,皮!)城內(nèi)風(fēng)光無限,源碼的海洋任我們遨游!你想好入城了嗎?我是怎么
    發(fā)表于 08-06 07:00

    請問這倆寄存器地址不是一了嗎?

    問一下sfrP2OD = 0x93;***itP23= 0x93;這倆地址不是一了嗎???
    發(fā)表于 08-27 04:35

    如何tft型號?

    求助如何tft 型號??? 上電復(fù)位后直接就是了嗎?屏說是兼容 ili9320時序的,9320程序可以直接驅(qū)動同樣的3塊屏讀出來的總是FFFF白屏,是什么情況?
    發(fā)表于 07-31 02:58

    iPhone8什么時候上市:情不知所起一往而深!iPhone8哪些黑科技青睞你心?

    2017年是iPhone的十周年,所以近期關(guān)于iPhone2017年發(fā)布會的消息不斷,爆料簡直就是波接著一波,并且爆出的都是猛料,黑科技眾多加持的iPhone8,你想好要賣幾個腎了嗎?
    發(fā)表于 01-16 16:20 ?4021次閱讀

    華為mate10,mate10pro與保時捷定制版三選一你選誰?

    昨晚8點,華為正式在德國慕尼黑發(fā)布了華為mate10、mate10Pro和mate10保時捷設(shè)計。這對于華為粉絲來說,無疑是一顆重磅炸彈。那么這三選一你想好了嗎?
    發(fā)表于 10-17 17:10 ?4945次閱讀

    新科技對你我的生活的7大影響

    當(dāng)人工智能、物聯(lián)網(wǎng)、虛擬現(xiàn)實、增強現(xiàn)實、臉部識別等技術(shù)逐漸成熟,應(yīng)用層面也隨之?dāng)U大??催@些新科技如何翻轉(zhuǎn)你我的生活。
    的頭像 發(fā)表于 01-02 10:59 ?7767次閱讀

    機器人具備像人類一思考的能力了嗎

    科技時代的來臨,人們總在憂心會被機器取代??墒牵瑥娜斯ぶ悄芷鹪粗两?,60多年過去了,機器具備像人類一思考的能力了嗎
    發(fā)表于 10-22 15:18 ?7292次閱讀

    耳機需不需要一個功放

    當(dāng)你想好好享受音樂,經(jīng)過數(shù)小時甚至數(shù)天痛苦的研究后,決定忍痛剁手買了一副好的耳機,把隨機贈送的差耳機換掉,你以為這樣就可以了嗎?No。
    的頭像 發(fā)表于 04-30 10:42 ?1.6w次閱讀

    學(xué)會源碼特別重要

    剛參加工作那會,沒想過去源碼,更沒想過去改框架的源碼;總想著別人的框架應(yīng)該是完美的、萬能的,應(yīng)該不需要改;另外即使我改了源碼,怎么讓我的
    的頭像 發(fā)表于 12-31 10:29 ?1644次閱讀
    學(xué)會<b class='flag-5'>讀</b><b class='flag-5'>源碼</b>特別重要

    你想要的電壓在你想要的地方

    你想要的電壓在你想要的地方
    發(fā)表于 05-19 09:09 ?2次下載
    <b class='flag-5'>你想</b>要的電壓在<b class='flag-5'>你想</b>要的地方

    我們怎樣源碼才能更高效

    用了這么久的 Redis,也翻了很多次源碼,經(jīng)常有人問我到底怎么 Redis 源碼。 一提到源碼,很多人都會比較畏懼,認(rèn)為
    的頭像 發(fā)表于 11-12 09:38 ?1704次閱讀
    我們怎樣<b class='flag-5'>讀</b><b class='flag-5'>源碼</b>才能更高效

    新春佳節(jié)你想好送什么了嗎?愛國者告訴你滿意的答案

    虎年的鐘聲即將敲響,忙碌了一年的你春節(jié)期間最期待的事情是什么?是與父母親人歡聚一堂,還是約三五好友喝幾杯互相調(diào)侃呢?相信對于很多年輕人而言,約上朋友一起“開黑”才是迎接新年最正確的打開方式。 在很多人的眼里,90后、00后是伴隨著游戲一路成長過來的,事實也確實如此,在網(wǎng)絡(luò)迅速崛起之后,網(wǎng)絡(luò)以一種全新的方式走進(jìn)了每個人的生活中,而網(wǎng)絡(luò)游戲也以一種休閑、娛樂、放松的方式伴隨著這一時期的孩子們共同成長。從小時候
    的頭像 發(fā)表于 01-29 16:09 ?1130次閱讀
    新春佳節(jié)<b class='flag-5'>你想好</b>送什么<b class='flag-5'>了嗎</b>?愛國者<b class='flag-5'>告訴</b>你滿意的答案

    條碼二維碼識器廠商告訴你,條碼識設(shè)備有哪些產(chǎn)品形態(tài)?

    條碼識設(shè)備有哪些常見的產(chǎn)品形態(tài)?我們常見的條碼識設(shè)備應(yīng)該是掃碼槍,它外形小巧便攜,操作簡單方便。這種設(shè)備適用于需要頻繁掃描條碼的場景,例如超市收銀或倉庫管理等比較多見。條碼掃描槍通常通過無線或有
    的頭像 發(fā)表于 10-18 15:00 ?1234次閱讀
    條碼二維碼識<b class='flag-5'>讀</b>器廠商<b class='flag-5'>告訴</b>你,條碼識<b class='flag-5'>讀</b>設(shè)備有哪些產(chǎn)品形態(tài)?
    百家乐官网官网站| 太阳城广场| 百家乐官网游戏的玩法| 属马的和属猴的在一起做生意好吗| 大发888娱乐场下载专区| 任我赢百家乐官网自动投注分析系统| 百家乐关台| 遂川县| 百家乐在线投注网| 明水县| 奔驰百家乐游戏电玩| 真人游戏下载| 真人百家乐官网国际第一品牌| 大发888 打法888| 百家乐官网群shozo| 百家乐平台| 赙彩百家乐游戏规则| 百家乐官网体育博彩| 百家乐官网桌布呢布| 钻石国际| 百家乐太阳城| 真人百家乐官网新开户送彩金| 水浒传老虎机破解| 百家乐官网如何投注技巧| 百家乐赚水方| 百家乐官网游戏唯一官网网站 | 澳门百家乐经| 百家乐官网游戏图片| 大发888真钱赌场娱乐网规则| 在线百家乐代理| 百家乐官网趋势方向| 鑫鑫百家乐的玩法技巧和规则| 百家乐官网详情| 联众德州扑克| 哪个百家乐网站信誉好| 百家乐官网象棋赌博| 大发888大奖| 百家乐现场投注平台| 百家乐官网客户端下载| 大发888创建账号翻译| 百家乐有哪几种|