(一)從0開始寫框架—開篇介紹

概述

??我們這個(gè)系列的文章叫做“從0開始寫框架”,那從文章的標(biāo)題可以知道梢夯,這系列的文章主要是講:一個(gè)java框架是如何開發(fā)出來(lái)的言疗。看到這里颂砸,可能已經(jīng)有部分小伙伴不明覺厲了噪奄。
??但其實(shí),開發(fā)一個(gè)框架并不是什么很神秘人乓、很高大上的事情梗醇,就跟我們平時(shí)做業(yè)務(wù)類的項(xiàng)目差不多,這個(gè)差不多指的是開發(fā)形式上差不多撒蟀。不一樣的地方就在于思想上要做一個(gè)轉(zhuǎn)變叙谨,我們要從使用別人提供的功能,轉(zhuǎn)變?yōu)樘峁┕δ芙o別人使用保屯。這看似很簡(jiǎn)單的一句話手负,但卻非常關(guān)鍵涤垫,所以有必要再?gòu)?qiáng)調(diào)一次:“提供功能給別人使用”。有過框架開發(fā)經(jīng)驗(yàn)的開發(fā)者都知道竟终,在開發(fā)一個(gè)框架的過程中蝠猬,都會(huì)不斷的對(duì)自己說(shuō),“我這個(gè)功能是提供給別人用的统捶,怎么才能讓別人用起來(lái)簡(jiǎn)單一點(diǎn)榆芦,最好讓別人少寫代碼”,“需要怎么提高性能和安全喘鸟,讓別人用起來(lái)安心一點(diǎn)”匆绣,“為了應(yīng)對(duì)某些人有特殊的需求,所以必須要提高擴(kuò)展性”什黑。等等的這些話都是在我們開發(fā)一個(gè)框架的過程中崎淳,不斷提醒自己的,而這些話愕把,正是開發(fā)框架應(yīng)該具備的思想拣凹,在這些思想指引下,我們才會(huì)想方設(shè)法的使用各種技術(shù)來(lái)實(shí)現(xiàn)目標(biāo)恨豁。
??回到我們做業(yè)務(wù)項(xiàng)目上嚣镜,更多的是要求快點(diǎn)把功能完成,為了達(dá)到這個(gè)要求橘蜜,我們就會(huì)不斷的提醒自己:“代碼重復(fù)不要緊菊匿,后面有時(shí)間再重構(gòu)”,“性能很差不要緊扮匠,后面有時(shí)間再優(yōu)化”,但往往后面就不會(huì)重構(gòu)和優(yōu)化了凡涩,因?yàn)槟菚r(shí)棒搜,項(xiàng)目可能已經(jīng)很臃腫,看都不想去看了活箕。這種情況力麸,在開發(fā)框架項(xiàng)目上是絕對(duì)不能有的,所以說(shuō)開發(fā)框架的話育韩,一定要轉(zhuǎn)變自己的思想克蚂。
??還有一部分的小伙伴看到這個(gè)標(biāo)題后,可能會(huì)想筋讨,標(biāo)題黨又來(lái)了埃叭,什么寫框架啊,到頭來(lái)估計(jì)又是在講概念悉罕,講思想就完事了赤屋。首先立镶,概念和思想是肯定要講的,然后类早,我們才真正的從0開始去開發(fā)一個(gè)框架媚媒。但是,關(guān)鍵不是這個(gè)框架本身涩僻,而是做這個(gè)框架的過程缭召,所以不要太在意接下來(lái)要做什么框架,解決什么問題逆日。而是需要在意做框架的過程中嵌巷,它的方法和思想,這樣我們才能舉一反三屏富,觸類旁通晴竞。

怎么理解“框架”

??可能很多小伙伴從學(xué)習(xí)java的那一刻起,就跟著老師說(shuō)狠半,這框架那框架的噩死,但是老師從來(lái)沒有提過什么是框架,自己也沒有思考過,框架是什么,就知道這個(gè)就是框架了石挂,那個(gè)不是框架序六,對(duì)框架的概念理解很模糊,那現(xiàn)在批销,我們就來(lái)普及一些基礎(chǔ)常識(shí),比如插件、框架堂鲜、中間件這些術(shù)語(yǔ)的來(lái)龍去脈。
??首先护奈,框架的出現(xiàn)是我們對(duì)于“復(fù)用性”的要求越來(lái)越高缔莲,不想重復(fù)造輪子,從最初的單個(gè)函數(shù)的復(fù)用霉旗,到面向?qū)ο笾蓄惖膹?fù)用痴奏,再到由多個(gè)類組成的lib包,提供類庫(kù)的復(fù)用厌秒。復(fù)用軟件的抽象層次越來(lái)越高读拆,而框架就在這種背景下產(chǎn)生的⊥疑粒框架復(fù)用是抽象層次的又一提升檐晕,框架的復(fù)用不僅僅是功能的復(fù)用,更是設(shè)計(jì)的復(fù)用蚌讼。
??我們?cè)趤?lái)看看框架的含義:框架是一個(gè)半成品的應(yīng)用棉姐,它封裝了某領(lǐng)域內(nèi)處理流程的控制邏輯屠列,由于軟件開發(fā)各種領(lǐng)域問題眾多,所以框架必須具有針對(duì)性伞矩,比如笛洛,有針對(duì)底層通訊領(lǐng)域的框架,有針對(duì)分布式應(yīng)用領(lǐng)域的框架乃坤,有針對(duì)對(duì)象關(guān)系映射領(lǐng)域的框架等等苛让。框架這個(gè)半成品應(yīng)用像是一個(gè)骨架湿诊,然后我們?cè)谶@個(gè)骨架上添加血和肉狱杰,就是我們具體的業(yè)務(wù)代碼了,然后組成一個(gè)完整的應(yīng)用厅须。
??框架我們就了解到這里仿畸,接著我們來(lái)擴(kuò)展一下,看看什么是插件朗和,什么是中間件错沽。插件其實(shí)就類似我們上面提到的“類庫(kù)”了,由于復(fù)用性的要求眶拉,我們需要把一些重復(fù)使用的功能抽取出來(lái)千埃,而這個(gè)功能的實(shí)現(xiàn)又需要多個(gè)類組成,那么把這多個(gè)類打成一個(gè)包忆植,以工具的形式提供某種類型的功能給別使用放可,就是類庫(kù)或者說(shuō)插件了,它不能單獨(dú)成為一個(gè)應(yīng)用朝刊。比如:二維碼生成工具耀里、文件操作工具、報(bào)表生成工具等等拾氓。打個(gè)比喻冯挎,如果說(shuō)框架是骨架,我們的業(yè)務(wù)功能是血和肉痪枫,那么插件或者說(shuō)工具類庫(kù)就像是:牙齒织堂、頭發(fā)和指甲之類的了叠艳,有它們最好奶陈,沒有也不會(huì)死。最后來(lái)看看什么是“中間件”附较,不同于剛剛說(shuō)的框架和插件吃粒,框架、插件和我們的業(yè)務(wù)代碼共同組成一個(gè)應(yīng)用拒课,而中間件它本身就是一個(gè)獨(dú)立運(yùn)行徐勃,并且是完整的一個(gè)應(yīng)用事示,不是半成品應(yīng)用,這種類型的應(yīng)用主要是對(duì)外提供某種領(lǐng)域的網(wǎng)絡(luò)服務(wù)給其他應(yīng)用使用僻肖,比如:數(shù)據(jù)庫(kù)服務(wù)中間件肖爵,分布式緩存中間件,消息隊(duì)列中間件臀脏,搜索引擎中間件等等劝堪。打個(gè)比喻的話,就是你的合伙人揉稚,你的隊(duì)友之類的秒啦,你們每個(gè)獨(dú)立的個(gè)體相互合作,共同完成某個(gè)目標(biāo)搀玖。

具體目的

??該鋪墊的東西我們已經(jīng)鋪墊好了余境,接下來(lái)就要準(zhǔn)備動(dòng)手開發(fā)這個(gè)框架了。通過上面對(duì)框架的了解灌诅,我們知道芳来,每個(gè)具體的框架都是在解決特點(diǎn)領(lǐng)域問題的,那這樣的話延塑,我們接下來(lái)要開發(fā)的這個(gè)框架是解決什么領(lǐng)域的問題呢绣张?這個(gè)領(lǐng)域的選擇也是不能隨意的,首先关带,需要排除那些老舊的領(lǐng)域:比如ORM侥涵、MVC這些領(lǐng)域,因?yàn)檫@些領(lǐng)域制造不了多少話題宋雏。還要排除解決方案非常成熟的領(lǐng)域:比如底層通訊芜飘,分布式應(yīng)用,這些領(lǐng)域因?yàn)榘l(fā)展的時(shí)間比較長(zhǎng)磨总,都比較成熟和完善了嗦明,也就沒有多大的必要再拿來(lái)研究。那經(jīng)過排除之后蚪燕,我們就選擇現(xiàn)在比較熱門的話題娶牌,面試的時(shí)候也是經(jīng)常問到的,并且現(xiàn)階段馆纳,還沒有一個(gè)非常成熟的解決方案诗良,就是:“分布式事務(wù)”,我們用這個(gè)領(lǐng)域的問題作為載體鲁驶,去開發(fā)一個(gè)分布式事務(wù)框架鉴裹。但是,還是需要再?gòu)?qiáng)調(diào)一下,我們的目的是學(xué)習(xí)框架的開發(fā)過程径荔,而不是這個(gè)具體的分布式事務(wù)框架督禽。

注:阿里在18年年底開源了一個(gè)分布式事務(wù)框架:fescar。地址為:https://github.com/alibaba/fescar总处,雖然現(xiàn)階段還不是很完善狈惫,但看阿里官方的規(guī)劃,后面的版本是會(huì)越來(lái)越強(qiáng)大的鹦马,大家有時(shí)間可以上去學(xué)習(xí)一下虱岂。

??在開發(fā)這個(gè)分布式事務(wù)框架的過程中,我們會(huì)學(xué)到很多技術(shù)菠红,學(xué)習(xí)這些技術(shù)才是我們開發(fā)這個(gè)框架的目的第岖,而這些技術(shù)又是在平時(shí)我們做業(yè)務(wù)類的項(xiàng)目很少有機(jī)會(huì)接觸的,具體如下:

  • 注解的使用
    ??我們這里所說(shuō)的注解的使用试溯,并不是指平時(shí)我們做業(yè)務(wù)功能時(shí)蔑滓,貼一個(gè)注解就完事的那種用,而是去定義一個(gè)注解遇绞,然后給該注解賦予一個(gè)意義键袱,也就是說(shuō),我貼了這個(gè)注解摹闽,能幫我完成什么功能蹄咖。在我們做業(yè)務(wù)項(xiàng)目的過程中,是很少有機(jī)會(huì)讓我們?nèi)ザx注解的付鹿,而做框架就不一樣了澜汤,我們上文提到的,做框架其中一個(gè)思想:易用性舵匾,如果你想讓你的框架俊抵,在給別人用的時(shí)候,是很簡(jiǎn)單的坐梯,那就需要考慮使用注解了徽诲,被人不用怎么去寫代碼,只需要貼個(gè)注解吵血,然后框架就幫他做完了事情谎替。
  • 并發(fā)的使用
    ??很多小伙伴經(jīng)常反映,java下的并發(fā)包(concurrent)下的東西很少使用蹋辅,我們?nèi)绻亲鰳I(yè)務(wù)類的項(xiàng)目钱贯,那確實(shí)是這樣的,但是如果我們要做框架晕翠,那就不是了喷舀,因?yàn)樾阅芎桶踩彩亲隹蚣艿囊粋€(gè)指導(dǎo)思想,每時(shí)每刻都需要思考淋肾,什么功能需要使用多線程來(lái)提高性能硫麻,什么功能又會(huì)不會(huì)因?yàn)椴l(fā),導(dǎo)致出現(xiàn)安全問題樊卓。在開發(fā)的時(shí)候就需要精心設(shè)計(jì)了拿愧,而不是說(shuō)開發(fā)完了再優(yōu)化,不然的話碌尔,我相信做出來(lái)的框架不會(huì)有人敢冒險(xiǎn)使用的浇辜。
  • SPI的使用
    ??SPI是Service Provider Interface的簡(jiǎn)寫,這項(xiàng)技術(shù)也是平時(shí)我們做業(yè)務(wù)項(xiàng)目沒機(jī)會(huì)接觸的唾戚,我們知道柳洋,一個(gè)好的框架,肯定是一個(gè)擴(kuò)展性很強(qiáng)的框架叹坦,這個(gè)在我們上文講開發(fā)框架的指導(dǎo)思想時(shí)也提到了熊镣,也就是擴(kuò)展性。接下來(lái)我們?cè)俾议_SPI的神秘面紗募书。
  • 設(shè)計(jì)模式的使用
    ??最后需要提及的技術(shù)就是設(shè)計(jì)思想绪囱,這個(gè)可以說(shuō)是一個(gè)框架的靈魂了,我們?cè)谥v框架概念的時(shí)候提到莹捡,框架就是對(duì)軟件“復(fù)用性”的要求越來(lái)越高的產(chǎn)物鬼吵,使用硬編碼是肯定不能達(dá)到“復(fù)用性”的要求的,所以篮赢,各種設(shè)計(jì)模式就應(yīng)運(yùn)而生了齿椅。在開發(fā)框架的過程中,我們會(huì)接觸一些業(yè)務(wù)項(xiàng)目沒機(jī)會(huì)接觸的設(shè)計(jì)模式启泣,比如動(dòng)態(tài)代理模式媒咳,工廠模式,策略模式种远,適配器模式涩澡。
    ??學(xué)習(xí)以上的這些技術(shù)才是我為什么要寫這個(gè)專題文章的目的,我想每一個(gè)程序猿都有一個(gè)小目標(biāo)坠敷,不是賺一個(gè)億妙同,而是做架構(gòu)獅,當(dāng)然膝迎,架構(gòu)獅是會(huì)寫業(yè)務(wù)代碼的粥帚,因?yàn)槿魏伍_發(fā)語(yǔ)言的架構(gòu)獅都是從一線開發(fā)成長(zhǎng)起來(lái)的,但是只會(huì)寫業(yè)務(wù)代碼的程序猿是不可能做架構(gòu)獅的限次,而掌握以上技術(shù)芒涡,就是成為架構(gòu)獅的第一步柴灯。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市费尽,隨后出現(xiàn)的幾起案子赠群,更是在濱河造成了極大的恐慌,老刑警劉巖旱幼,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件查描,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡柏卤,警方通過查閱死者的電腦和手機(jī)冬三,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缘缚,“玉大人勾笆,你說(shuō)我怎么就攤上這事∏疟酰” “怎么了匠襟?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)该园。 經(jīng)常有香客問我酸舍,道長(zhǎng),這世上最難降的妖魔是什么里初? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任啃勉,我火速辦了婚禮,結(jié)果婚禮上双妨,老公的妹妹穿的比我還像新娘淮阐。我一直安慰自己,他們只是感情好刁品,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布泣特。 她就那樣靜靜地躺著,像睡著了一般挑随。 火紅的嫁衣襯著肌膚如雪状您。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天兜挨,我揣著相機(jī)與錄音膏孟,去河邊找鬼。 笑死拌汇,一個(gè)胖子當(dāng)著我的面吹牛柒桑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播噪舀,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼魁淳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼飘诗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起界逛,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤昆稿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后仇奶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡比驻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年该溯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片别惦。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狈茉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掸掸,到底是詐尸還是另有隱情氯庆,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布扰付,位于F島的核電站堤撵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏羽莺。R本人自食惡果不足惜实昨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盐固。 院中可真熱鬧荒给,春花似錦、人聲如沸刁卜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛔趴。三九已至挑辆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孝情,已是汗流浹背之拨。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咧叭,地道東北人蚀乔。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像菲茬,于是被迫代替她去往敵國(guó)和親吉挣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子派撕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,930評(píng)論 2 89
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,098評(píng)論 1 32
  • 一身黃袍蔽自由 不聞百姓疾苦聲 臣子野心宮角斗 寡人甘自為庶人
    山屈生閱讀 149評(píng)論 0 0
  • 有時(shí),人真是孤獨(dú)睬魂。 ---------林宇軒------轉(zhuǎn)載必經(jīng)本人同意--- 有朋友终吼,有工作,有同事氯哮,有家人际跪,但...
    蜀錦景泰藍(lán)閱讀 232評(píng)論 0 1
  • 為了安裝Ubuntu和樹莓派,我在兩個(gè)U盤中都繞錄了不同的系統(tǒng)喉钢。但是安裝完姆打,想恢復(fù)U盤的正常使用,方法如下: 在w...
    玩er2017閱讀 1,922評(píng)論 0 0