本文作者:羅海鵬,叩丁狼高級講師烈炭。原創(chuàng)文章,轉(zhuǎn)載請注明出處购岗。
概述
??我們這個系列的文章叫做“從0開始寫框架”刹缝,那從文章的標(biāo)題可以知道详炬,這系列的文章主要是講:一個java框架是如何開發(fā)出來的裙品∪趟危看到這里,可能已經(jīng)有部分小伙伴不明覺厲了溜徙。
??但其實洒宝,開發(fā)一個框架并不是什么很神秘、很高大上的事情萌京,就跟我們平時做業(yè)務(wù)類的項目差不多,這個差不多指的是開發(fā)形式上差不多宏浩。不一樣的地方就在于思想上要做一個轉(zhuǎn)變知残,我們要從使用別人提供的功能,轉(zhuǎn)變?yōu)樘峁┕δ芙o別人使用比庄。這看似很簡單的一句話求妹,但卻非常關(guān)鍵,所以有必要再強調(diào)一次:“提供功能給別人使用”佳窑。有過框架開發(fā)經(jīng)驗的開發(fā)者都知道制恍,在開發(fā)一個框架的過程中,都會不斷的對自己說神凑,“我這個功能是提供給別人用的净神,怎么才能讓別人用起來簡單一點,最好讓別人少寫代碼”溉委,“需要怎么提高性能和安全鹃唯,讓別人用起來安心一點”,“為了應(yīng)對某些人有特殊的需求瓣喊,所以必須要提高擴展性”坡慌。等等的這些話都是在我們開發(fā)一個框架的過程中,不斷提醒自己的藻三,而這些話洪橘,正是開發(fā)框架應(yīng)該具備的思想,在這些思想指引下棵帽,我們才會想方設(shè)法的使用各種技術(shù)來實現(xiàn)目標(biāo)熄求。
??回到我們做業(yè)務(wù)項目上,更多的是要求快點把功能完成逗概,為了達(dá)到這個要求抡四,我們就會不斷的提醒自己:“代碼重復(fù)不要緊,后面有時間再重構(gòu)”,“性能很差不要緊指巡,后面有時間再優(yōu)化”淑履,但往往后面就不會重構(gòu)和優(yōu)化了,因為那時藻雪,項目可能已經(jīng)很臃腫秘噪,看都不想去看了。這種情況勉耀,在開發(fā)框架項目上是絕對不能有的指煎,所以說開發(fā)框架的話,一定要轉(zhuǎn)變自己的思想便斥。
??還有一部分的小伙伴看到這個標(biāo)題后至壤,可能會想,標(biāo)題黨又來了枢纠,什么寫框架啊像街,到頭來估計又是在講概念,講思想就完事了晋渺。首先镰绎,概念和思想是肯定要講的,然后木西,我們才真正的從0開始去開發(fā)一個框架畴栖。但是,關(guān)鍵不是這個框架本身八千,而是做這個框架的過程吗讶,所以不要太在意接下來要做什么框架,解決什么問題恋捆。而是需要在意做框架的過程中关翎,它的方法和思想,這樣我們才能舉一反三鸠信,觸類旁通纵寝。
怎么理解“框架”
??可能很多小伙伴從學(xué)習(xí)java的那一刻起,就跟著老師說星立,這框架那框架的爽茴,但是老師從來沒有提過什么是框架,自己也沒有思考過绰垂,框架是什么室奏,就知道這個就是框架了,那個不是框架劲装,對框架的概念理解很模糊胧沫,那現(xiàn)在昌简,我們就來普及一些基礎(chǔ)常識,比如插件绒怨、框架纯赎、中間件這些術(shù)語的來龍去脈。
??首先南蹂,框架的出現(xiàn)是我們對于“復(fù)用性”的要求越來越高犬金,不想重復(fù)造輪子,從最初的單個函數(shù)的復(fù)用六剥,到面向?qū)ο笾蓄惖膹?fù)用晚顷,再到由多個類組成的lib包,提供類庫的復(fù)用疗疟。復(fù)用軟件的抽象層次越來越高该默,而框架就在這種背景下產(chǎn)生的〔咄框架復(fù)用是抽象層次的又一提升栓袖,框架的復(fù)用不僅僅是功能的復(fù)用,更是設(shè)計的復(fù)用锅锨。
??我們在來看看框架的含義:框架是一個半成品的應(yīng)用,它封裝了某領(lǐng)域內(nèi)處理流程的控制邏輯恋沃,由于軟件開發(fā)各種領(lǐng)域問題眾多必搞,所以框架必須具有針對性,比如囊咏,有針對底層通訊領(lǐng)域的框架恕洲,有針對分布式應(yīng)用領(lǐng)域的框架,有針對對象關(guān)系映射領(lǐng)域的框架等等梅割∷冢框架這個半成品應(yīng)用像是一個骨架,然后我們在這個骨架上添加血和肉户辞,就是我們具體的業(yè)務(wù)代碼了泌类,然后組成一個完整的應(yīng)用。
??框架我們就了解到這里底燎,接著我們來擴展一下刃榨,看看什么是插件,什么是中間件双仍。插件其實就類似我們上面提到的“類庫”了枢希,由于復(fù)用性的要求,我們需要把一些重復(fù)使用的功能抽取出來朱沃,而這個功能的實現(xiàn)又需要多個類組成苞轿,那么把這多個類打成一個包茅诱,以工具的形式提供某種類型的功能給別使用,就是類庫或者說插件了搬卒,它不能單獨成為一個應(yīng)用瑟俭。比如:二維碼生成工具、文件操作工具秀睛、報表生成工具等等尔当。打個比喻,如果說框架是骨架蹂安,我們的業(yè)務(wù)功能是血和肉椭迎,那么插件或者說工具類庫就像是:牙齒、頭發(fā)和指甲之類的了田盈,有它們最好畜号,沒有也不會死。最后來看看什么是“中間件”允瞧,不同于剛剛說的框架和插件简软,框架、插件和我們的業(yè)務(wù)代碼共同組成一個應(yīng)用述暂,而中間件它本身就是一個獨立運行痹升,并且是完整的一個應(yīng)用,不是半成品應(yīng)用畦韭,這種類型的應(yīng)用主要是對外提供某種領(lǐng)域的網(wǎng)絡(luò)服務(wù)給其他應(yīng)用使用疼蛾,比如:數(shù)據(jù)庫服務(wù)中間件,分布式緩存中間件艺配,消息隊列中間件察郁,搜索引擎中間件等等。打個比喻的話转唉,就是你的合伙人皮钠,你的隊友之類的,你們每個獨立的個體相互合作赠法,共同完成某個目標(biāo)麦轰。
具體目的
??該鋪墊的東西我們已經(jīng)鋪墊好了,接下來就要準(zhǔn)備動手開發(fā)這個框架了砖织。通過上面對框架的了解原朝,我們知道,每個具體的框架都是在解決特點領(lǐng)域問題的镶苞,那這樣的話喳坠,我們接下來要開發(fā)的這個框架是解決什么領(lǐng)域的問題呢?這個領(lǐng)域的選擇也是不能隨意的茂蚓,首先壕鹉,需要排除那些老舊的領(lǐng)域:比如ORM剃幌、MVC這些領(lǐng)域,因為這些領(lǐng)域制造不了多少話題晾浴。還要排除解決方案非常成熟的領(lǐng)域:比如底層通訊负乡,分布式應(yīng)用,這些領(lǐng)域因為發(fā)展的時間比較長脊凰,都比較成熟和完善了抖棘,也就沒有多大的必要再拿來研究。那經(jīng)過排除之后狸涌,我們就選擇現(xiàn)在比較熱門的話題切省,面試的時候也是經(jīng)常問到的,并且現(xiàn)階段帕胆,還沒有一個非常成熟的解決方案朝捆,就是:“分布式事務(wù)”,我們用這個領(lǐng)域的問題作為載體懒豹,去開發(fā)一個分布式事務(wù)框架芙盘。但是,還是需要再強調(diào)一下脸秽,我們的目的是學(xué)習(xí)框架的開發(fā)過程儒老,而不是這個具體的分布式事務(wù)框架。
注:阿里在18年年底開源了一個分布式事務(wù)框架:fescar记餐。地址為:https://github.com/alibaba/fescar驮樊,雖然現(xiàn)階段還不是很完善,但看阿里官方的規(guī)劃剥扣,后面的版本是會越來越強大的巩剖,大家有時間可以上去學(xué)習(xí)一下铝穷。
??在開發(fā)這個分布式事務(wù)框架的過程中钠怯,我們會學(xué)到很多技術(shù),學(xué)習(xí)這些技術(shù)才是我們開發(fā)這個框架的目的曙聂,而這些技術(shù)又是在平時我們做業(yè)務(wù)類的項目很少有機會接觸的晦炊,具體如下:
-
注解的使用
??我們這里所說的注解的使用,并不是指平時我們做業(yè)務(wù)功能時宁脊,貼一個注解就完事的那種用断国,而是去定義一個注解,然后給該注解賦予一個意義榆苞,也就是說稳衬,我貼了這個注解,能幫我完成什么功能坐漏。在我們做業(yè)務(wù)項目的過程中薄疚,是很少有機會讓我們?nèi)ザx注解的碧信,而做框架就不一樣了,我們上文提到的街夭,做框架其中一個思想:易用性砰碴,如果你想讓你的框架,在給別人用的時候板丽,是很簡單的呈枉,那就需要考慮使用注解了,被人不用怎么去寫代碼埃碱,只需要貼個注解猖辫,然后框架就幫他做完了事情。 -
并發(fā)的使用
??很多小伙伴經(jīng)常反映乃正,java下的并發(fā)包(concurrent)下的東西很少使用住册,我們?nèi)绻亲鰳I(yè)務(wù)類的項目,那確實是這樣的瓮具,但是如果我們要做框架荧飞,那就不是了,因為性能和安全也是做框架的一個指導(dǎo)思想名党,每時每刻都需要思考叹阔,什么功能需要使用多線程來提高性能,什么功能又會不會因為并發(fā)传睹,導(dǎo)致出現(xiàn)安全問題耳幢。在開發(fā)的時候就需要精心設(shè)計了,而不是說開發(fā)完了再優(yōu)化欧啤,不然的話睛藻,我相信做出來的框架不會有人敢冒險使用的。 -
SPI的使用
??SPI是Service Provider Interface的簡寫邢隧,這項技術(shù)也是平時我們做業(yè)務(wù)項目沒機會接觸的店印,我們知道,一個好的框架倒慧,肯定是一個擴展性很強的框架按摘,這個在我們上文講開發(fā)框架的指導(dǎo)思想時也提到了,也就是擴展性纫谅。接下來我們再慢慢揭開SPI的神秘面紗炫贤。 -
設(shè)計模式的使用
??最后需要提及的技術(shù)就是設(shè)計思想,這個可以說是一個框架的靈魂了付秕,我們在講框架概念的時候提到兰珍,框架就是對軟件“復(fù)用性”的要求越來越高的產(chǎn)物,使用硬編碼是肯定不能達(dá)到“復(fù)用性”的要求的询吴,所以掠河,各種設(shè)計模式就應(yīng)運而生了励幼。在開發(fā)框架的過程中,我們會接觸一些業(yè)務(wù)項目沒機會接觸的設(shè)計模式口柳,比如動態(tài)代理模式苹粟,工廠模式,策略模式跃闹,適配器模式嵌削。
??學(xué)習(xí)以上的這些技術(shù)才是我為什么要寫這個專題文章的目的,我想每一個程序猿都有一個小目標(biāo)望艺,不是賺一個億苛秕,而是做架構(gòu)獅,當(dāng)然找默,架構(gòu)獅是會寫業(yè)務(wù)代碼的艇劫,因為任何開發(fā)語言的架構(gòu)獅都是從一線開發(fā)成長起來的,但是只會寫業(yè)務(wù)代碼的程序猿是不可能做架構(gòu)獅的惩激,而掌握以上技術(shù)店煞,就是成為架構(gòu)獅的第一步。
想獲取更多技術(shù)干貨风钻,請前往叩丁狼官網(wǎng):http://www.wolfcode.cn/all_article.html