看完這篇貌夕,別人的開源項(xiàng)目結(jié)構(gòu)應(yīng)該能看懂了

image

我為什么要寫這篇

近來律歼,和不少初學(xué)Spring或Spring Boot的小伙伴私信交流了關(guān)于項(xiàng)目目錄結(jié)構(gòu)劃分和代碼分層的問題。

很多小伙伴表示網(wǎng)上下載下來的開源項(xiàng)目看不懂啡专,項(xiàng)目結(jié)構(gòu)和代碼分層看得很蒙险毁,不知道應(yīng)該以一個(gè)什么樣的思路去學(xué)習(xí)和吸收別人的項(xiàng)目。

好,今天熬夜肝了這篇文章畔况,和大家一起來交流探討一下离唐,不足之處也請(qǐng)小伙伴們批評(píng)指正。


先看看阿里是怎么約定的

我印象中问窃,以前在看《阿里巴巴Java開發(fā)手冊(cè)》時(shí)亥鬓,好像有關(guān)于工程結(jié)構(gòu)和應(yīng)用分層相關(guān)的內(nèi)容,于是我回翻了一下域庇,果然有:

image

它這里面講的內(nèi)容大概就是:關(guān)于一個(gè)正常的企業(yè)項(xiàng)目里一種通用的項(xiàng)目結(jié)構(gòu)和代碼層級(jí)劃分的指導(dǎo)意見嵌戈。

按這本書上說的,一般分為如下幾層:

  • 開放接口層
  • 終端顯示層
  • Web 層
  • Service 層
  • Manager 層
  • DAO 層
  • 外部接口或第三方平臺(tái)

由于書中的篇幅關(guān)系听皿,它這地方講得比較籠統(tǒng)了熟呛,估計(jì)初學(xué)者看了還是會(huì)懵,所以接下來結(jié)合實(shí)際項(xiàng)目代碼結(jié)構(gòu)尉姨,來嘮一嘮具體的項(xiàng)目結(jié)構(gòu)和代碼分層庵朝。


通常的項(xiàng)目結(jié)構(gòu)

首先說在前面的是:這東西并沒有一套通用的標(biāo)準(zhǔn),不同公司或者團(tuán)隊(duì)的使用習(xí)慣和規(guī)范也不盡相同又厉。

我們就以當(dāng)下非尘鸥火熱的Spring Boot典型項(xiàng)目結(jié)構(gòu)為例,創(chuàng)建出來的項(xiàng)目應(yīng)該總體分為三大層:

image
  • 項(xiàng)目根目錄/src/main/java:放置項(xiàng)目Java源代碼
  • 項(xiàng)目根目錄/src/main/resources:放置項(xiàng)目靜態(tài)資源和配置文件
  • 項(xiàng)目根目錄/src/test/java:放置項(xiàng)目測(cè)試用例代碼

而位于/src/main/java目錄下的Java源代碼的組織結(jié)構(gòu)大家比較關(guān)心覆致,這地方也只能給出一個(gè)通常典型的結(jié)構(gòu)侄旬,畢竟不同項(xiàng)目和團(tuán)隊(duì)實(shí)踐不一樣,稍許有區(qū)別煌妈,但整體安排應(yīng)該差不多儡羔。而且如果是多模塊的項(xiàng)目的話,下面的結(jié)構(gòu)應(yīng)該只對(duì)應(yīng)其中一個(gè)模塊璧诵,其他模塊的代碼組織也大致差不多汰蜘。

image

各個(gè)目錄詳細(xì)介紹:

|_annotation:放置項(xiàng)目自定義注解
|_aspect:放置切面代碼
|_config:放置配置類
|_constant:放置常量、枚舉等定義
   |__consist:存放常量定義
   |__enums:存放枚舉定義
|_controller:放置控制器代碼
|_filter:放置一些過濾之宿、攔截相關(guān)的代碼
|_mapper:放置數(shù)據(jù)訪問層代碼接口
|_model:放置數(shù)據(jù)模型代碼
   |__entity:放置數(shù)據(jù)庫(kù)實(shí)體對(duì)象定義
   |__dto:存放數(shù)據(jù)傳輸對(duì)象定義
   |__vo:存放顯示層對(duì)象定義
|_service:放置具體的業(yè)務(wù)邏輯代碼(接口和實(shí)現(xiàn)分離)
   |__intf:存放業(yè)務(wù)邏輯接口定義
   |__impl:存放業(yè)務(wù)邏輯實(shí)際實(shí)現(xiàn)
|_utils:放置工具類和輔助代碼

然后接下來/src/main/resources目錄族操,里面主要存放靜態(tài)配置文件和頁(yè)面靜態(tài)資源等東西:

|_mapper:存放mybatis的XML映射文件(如果是mybatis項(xiàng)目)
|_static:存放網(wǎng)頁(yè)靜態(tài)資源,比如下面的js/css/img
   |__js:
   |__css:
   |__img:
   |__font:
   |__等等
|_template:存放網(wǎng)頁(yè)模板澈缺,比如thymeleaf/freemarker模板等
   |__header
   |__sidebar
   |__bottom
   |__XXX.html等等
|_application.yml       基本配置文件
|_application-dev.yml   開發(fā)環(huán)境配置文件
|_application-test.yml  測(cè)試環(huán)境配置文件
|_application-prod.yml  生產(chǎn)環(huán)境配置文件

當(dāng)然坪创,這地方估計(jì)有一個(gè)很多人都會(huì)糾結(jié)的關(guān)于DTO/VO/DO數(shù)據(jù)模型定義的區(qū)分。

這在《阿里巴巴Java開發(fā)手冊(cè)》中倒是做了一個(gè)所謂的嚴(yán)格區(qū)分姐赡,那本書上是這樣去定義的:

  • DO(Data Object):與數(shù)據(jù)庫(kù)表結(jié)構(gòu)一一對(duì)應(yīng),通過DAO層向上傳輸數(shù)據(jù)源對(duì)象柠掂。
  • DTO(Data Transfer Object):數(shù)據(jù)傳輸對(duì)象项滑,Service或Manager向外傳輸?shù)膶?duì)象。
  • BO(Business Object):業(yè)務(wù)對(duì)象涯贞。由Service層輸出的封裝業(yè)務(wù)邏輯的對(duì)象枪狂。
  • AO(Application Object):應(yīng)用對(duì)象危喉。在Web層與Service層之間抽象的復(fù)用對(duì)象模型,極為貼近展示層州疾,復(fù)用度不高辜限。
  • VO(View Object):顯示層對(duì)象,通常是Web向模板渲染引擎層傳輸?shù)膶?duì)象严蓖。
  • Query:數(shù)據(jù)查詢對(duì)象薄嫡,各層接收上層的查詢請(qǐng)求。注意超過2個(gè)參數(shù)的查詢封裝颗胡,禁止使用Map類來傳輸毫深。

老實(shí)講,看到這么多對(duì)象的定義毒姨,我也是很蒙的哑蔫。實(shí)際項(xiàng)目開發(fā)時(shí),我覺得沒有必要刻意照搬去定義這么多層對(duì)象弧呐,這樣后續(xù)做對(duì)象轉(zhuǎn)換工作都能煩skr人闸迷。

出于簡(jiǎn)單起見,我個(gè)人覺得俘枫,只要保證業(yè)務(wù)邏輯層Service和數(shù)據(jù)庫(kù)DAO層的操作對(duì)象嚴(yán)格劃分出來稿黍,確保互相不滲透崩哩,不混用巡球,問題應(yīng)該就不大。

比如在我上面舉例的這個(gè)項(xiàng)目的代碼結(jié)構(gòu)中邓嘹,Service層處理的對(duì)象都定義在了dto包里酣栈,而DAO層處理的對(duì)象都放在了entity包里了。


項(xiàng)目結(jié)構(gòu)劃分總結(jié)

如果從一個(gè)用戶訪問一個(gè)網(wǎng)站的情況來看汹押,對(duì)應(yīng)著上面的項(xiàng)目代碼結(jié)構(gòu)來分析矿筝,可以貫穿整個(gè)代碼分層:

image

對(duì)應(yīng)代碼目錄的流轉(zhuǎn)邏輯就是:

image

我想,應(yīng)該看得比較清楚了吧棚贾。

所以窖维,以后每當(dāng)我們拿到一個(gè)新的項(xiàng)目到手時(shí),只要按照這個(gè)思路去看別人項(xiàng)目的代碼妙痹,應(yīng)該基本都是能理得順的铸史。


一些注意事項(xiàng)

1、Contorller層參數(shù)傳遞建議不要使用HashMap怯伊,建議使用數(shù)據(jù)模型定義

2琳轿、Controller層里可以做參數(shù)校驗(yàn)、異常拋出等操作,但建議不要放太多業(yè)務(wù)邏輯崭篡,業(yè)務(wù)邏輯盡量放到Service層代碼中去做

3挪哄、Service層做實(shí)際業(yè)務(wù)邏輯,可以按照功能模塊做好定義和區(qū)分琉闪,相互可以調(diào)用

4迹炼、功能模塊Service之間引用時(shí),建議不要滲透到DAO層(或者mapper層)颠毙,基于Service層進(jìn)行調(diào)用和復(fù)用比較合理

5斯入、業(yè)務(wù)邏輯層Service和數(shù)據(jù)庫(kù)DAO層的操作對(duì)象不要混用。Controller層的數(shù)據(jù)對(duì)象不要直接滲透到DAO層(或者mapper層)吟秩;同理數(shù)據(jù)表實(shí)體對(duì)象Entity也不要直接傳到Controller層進(jìn)行輸出或展示咱扣。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涵防,隨后出現(xiàn)的幾起案子闹伪,更是在濱河造成了極大的恐慌,老刑警劉巖壮池,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偏瓤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡椰憋,警方通過查閱死者的電腦和手機(jī)厅克,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橙依,“玉大人证舟,你說我怎么就攤上這事〈捌铮” “怎么了女责?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)创译。 經(jīng)常有香客問我抵知,道長(zhǎng),這世上最難降的妖魔是什么软族? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任刷喜,我火速辦了婚禮,結(jié)果婚禮上立砸,老公的妹妹穿的比我還像新娘掖疮。我一直安慰自己,他們只是感情好仰禽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布氮墨。 她就那樣靜靜地躺著纺蛆,像睡著了一般吐葵。 火紅的嫁衣襯著肌膚如雪规揪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天温峭,我揣著相機(jī)與錄音猛铅,去河邊找鬼。 笑死凤藏,一個(gè)胖子當(dāng)著我的面吹牛奸忽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揖庄,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栗菜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蹄梢?” 一聲冷哼從身側(cè)響起疙筹,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎禁炒,沒想到半個(gè)月后而咆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幕袱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年暴备,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片们豌。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涯捻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出望迎,到底是詐尸還是另有隱情障癌,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布擂煞,位于F島的核電站混弥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏对省。R本人自食惡果不足惜蝗拿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒿涎。 院中可真熱鬧哀托,春花似錦、人聲如沸劳秋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至嗽冒,卻和暖如春呀伙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背添坊。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工剿另, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贬蛙。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓雨女,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阳准。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氛堕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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