概述
??我們這個(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)獅的第一步柴灯。