一篇就夠 | 教你用maven搭建自己的開發(fā)框架

這篇文章先會(huì)討論什么是"框架",然后向你展示一個(gè)基于 maven 特性搭建的自制開發(fā)框架與該框架的使用示例,最后將這個(gè)自制框架的搭建過程整理給你凸舵。這篇文章適用于對maven有足夠了解的讀者失尖,如果你還不認(rèn)識maven,歡迎閱讀我的另一篇文章:

一篇就夠 | 快速理解什么是maven

內(nèi)容預(yù)覽:

  • 討論什么是“框架”
  • 展示一個(gè)簡單的基于 maven 特性搭建的自制框架
  • 展示上述自制框架的使用示例
  • 自制框架的搭建過程

一菇夸、什么是框架

概念

筆者認(rèn)為仪吧,所謂的框架,是指一套抽象的規(guī)范择诈,符合某一框架的規(guī)范,則可稱為使用了這一框架或者基于這一框架羞芍。

舉個(gè)例子荷科,maven項(xiàng)目要求在根路徑有一個(gè)配置文件 pom.xml,還要求項(xiàng)目源代碼畏浆、項(xiàng)目測試代碼全度、項(xiàng)目靜態(tài)資源必須放置到指定的目錄里;再舉個(gè)例子将鸵,Spring項(xiàng)目需要定義或配置各種bean,注冊到容器里的bean草娜,可以被依賴注入注解來管理使用痒筒,完成IoC;最后再舉個(gè)例子移袍,MybatisORM框架老充,一方面需要通過配置文件指代清楚mapper代碼類所在的位置,一方面要在配置好的靜態(tài)文件目錄觅够。

框架有輕重之分巷嚣,所謂輕量級的框架,是指使用框架與不使用框架的區(qū)別并不明顯窘拯,框架規(guī)范對傳統(tǒng)開發(fā)侵入性低;而重量級的框架則相反直焙,框架規(guī)范對傳統(tǒng)開發(fā)的侵入性高砂轻,使用框架與不使用框架的區(qū)別很明顯。

二厨喂、自制框架 - zty-framework

作用概述

zty-framework 屬于輕量級框架庄呈,完全基于 maven 項(xiàng)目框架的特性對 Spring 框架進(jìn)行封裝,為不同種類的開發(fā)項(xiàng)目提供與項(xiàng)目類型對應(yīng)的整套 Spring 依賴斜纪,并且還定義了一套專有的規(guī)范文兑。主要功能如下:

  1. 簡化 Spring 項(xiàng)目搭建過程。按功能類型封裝常用功能依賴包因块,統(tǒng)一管理籍铁,對外提供完整的"依賴包套餐"。只需引入 zty-framework 的相應(yīng)模塊吩愧,即可完成對某一功能類型所需的所有依賴包的導(dǎo)入過程增显,既避免了重復(fù)引入依賴的人工操作,也大大減少修改依賴引入所需的工作量。
  2. 定義規(guī)范腮恩,減少重復(fù)工作秸滴,提升開發(fā)效率,改善開發(fā)質(zhì)量。針對絕大多數(shù)開發(fā)場景届垫,zty-framework 抽象出了一套通用的參數(shù)規(guī)范全释、異常信息規(guī)范和注解規(guī)范。開發(fā)者遵從這些規(guī)范進(jìn)行開發(fā)妄迁,可以很方便地完成統(tǒng)一參數(shù)校驗(yàn)李命、統(tǒng)一異常處理,既減輕了工作量黔州,也改善了開發(fā)質(zhì)量阔籽。

如果將 Spring 框架的各部分內(nèi)容比喻成小積木的話仿耽,那么 zty-framework 的各部分內(nèi)容則可以理解為——由幾個(gè)小積木組建成的模塊。

框架內(nèi)容展示

首先是 zty-framework 的目錄結(jié)構(gòu)圖:

zty-framework 目錄結(jié)構(gòu)

對于負(fù)責(zé)統(tǒng)一實(shí)現(xiàn)并管理實(shí)體類君躺、通用類(公共類)开缎、工具類的模塊,zty-framework 抽象出了 framework-common俺泣,其他項(xiàng)目只需引入 framework-common 依賴完残,即可完成所需依賴包的導(dǎo)入。framework-common 的 maven 依賴圖如下:

framework-common 依賴圖

zty-framework 的規(guī)范類熟掂,在 framework-common 里面進(jìn)行了實(shí)現(xiàn)扎拣。分別是這四部分:1)框架自定義注解;2)框架規(guī)范參數(shù)類誉券;3)框架異常規(guī)范類;4)框架工具類踩验。如果需修改這些內(nèi)容琴锭,只需在 framework-common 里進(jìn)行修改即可。

framework-common 內(nèi)容

對于負(fù)責(zé)實(shí)現(xiàn)與數(shù)據(jù)庫交互厕九、完成業(yè)務(wù)功能的模塊扁远,zty-framework 抽象出了 framework-bo(BO表示Business Object刻像,這里指業(yè)務(wù)對象層),其他項(xiàng)目只需引入 frame-bo 即完成了對所需依賴的導(dǎo)入谷羞。framework-bo 的 maven 依賴圖如下:

framework-bo 依賴圖

對于負(fù)責(zé)對外提供API接口溜徙、接口處理的模塊,zty-framework 抽象出了 framework-web嗓违,其他項(xiàng)目只需引入 frame-web 即完成了對所需依賴的導(dǎo)入图贸。framework-web 的 maven 依賴圖如下:

framework-web 依賴圖

對于按實(shí)際需要集成各模塊疏日、生成可部署項(xiàng)目的模塊,zty-framework 抽象出了 framework-springboot-app 模塊涕滋,maven 依賴圖如下:

framework-springboot-app 依賴圖

以上只是筆者搭建的示例净神,framework 各模塊的依賴可以按需選擇、調(diào)整爱榕。

使用示例

以實(shí)際項(xiàng)目中“賬號模塊”的實(shí)現(xiàn)作為 zty-framework 的使用示例坡慌,帶你更近一步感受 zty-framework 的便利。

首先是創(chuàng)建負(fù)責(zé)定義公用實(shí)體類的 account-common 模塊跪者,引入 framework-common 依賴:

account-common 依賴圖

account-common 的實(shí)體類包括數(shù)據(jù)對象類(DO)和數(shù)據(jù)傳輸對象類(DTO)渣玲,其中DO表示數(shù)據(jù)庫表結(jié)構(gòu)相對應(yīng)的實(shí)體類弟晚,DTO表示用于傳輸?shù)淖侄蚊撁艉蟮念悾琍OJO命名遵從阿里巴巴開發(fā)規(guī)范

account-common 內(nèi)容

第二步是創(chuàng)建負(fù)責(zé)完成與數(shù)據(jù)庫交互的 account-bo 模塊枚钓,引入 framework-bo 和 account-common 依賴:

account-bo 依賴圖

account-bo 模塊的內(nèi)容主要包括DAO類和Service類搀捷,如果業(yè)務(wù)涉及到復(fù)雜流程的實(shí)現(xiàn)多望,還可以基于Service類提供的方法,實(shí)現(xiàn)API類:

account-bo 內(nèi)容

第三步是創(chuàng)建負(fù)責(zé)提供 http 接口的 account-web 模塊至壤,引入 framework-web 和 account-bo 依賴:

account-web 依賴圖

account-web 主要實(shí)現(xiàn) Controller 類像街,完成參數(shù)檢查晋渺,調(diào)用 bo 層的接口方法實(shí)現(xiàn)功能:

account-web 內(nèi)容

最后一步,結(jié)合實(shí)際需求畴栖,對各個(gè)功能模塊進(jìn)行集成八千,搭建一個(gè)可部署的項(xiàng)目燎猛。這里的 service-customer 模塊引入了"賬號管理模塊"照皆、"微信授權(quán)模塊"膜毁、"文件管理模塊"和"緩存管理模塊"的依賴,當(dāng)然還有 framework-springboot-app瘟滨,完整依賴圖如下:

service-customer 依賴圖

各個(gè)其他模塊的功能杂瘸,皆已在各模塊內(nèi)完成了實(shí)現(xiàn),service-customer 只需基于 Spring AOP 按業(yè)務(wù)需求完成統(tǒng)一參數(shù)處理和統(tǒng)一異常處理即可:

service-customer 內(nèi)容

搭建過程

  1. 創(chuàng)建 maven 空工程昌简,命名為 framework绒怨;
  2. 將工程 framework 的 pom.xml 的<packaging>改為pom
  3. 在工程 framework 的 pom.xml 里定義框架的子模塊犬金,聲明到 <modules> 里六剥;

前3步的pom.xml完整代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
          http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <!-- 定義基本信息 -->
    <artifactId>framework</artifactId>
    <groupId>com.zty</groupId>
    <version>${zty-framework.version}</version>

    <!-- 父模塊必須設(shè)置為此 -->
    <packaging>pom</packaging>

    <!-- 集中版本管理 -->
    <properties>
        <zty-framework.version>0.1.1</zty-framework.version>
    </properties>

    <!-- 聲明子模塊 -->
    <modules>
        <module>framework-common</module>
        <module>framework-web</module>
        <module>framework-bo</module>
        <module>framework-springboot-app</module>
    </modules>
</project>
  1. 分別創(chuàng)建框架子模塊 framework-common疗疟、framework-bo、framework-web 和 framework-springboot-app栓袖,并在<parent>標(biāo)簽里使他們繼承于 framework店诗;
  2. 在相應(yīng)的模塊里引入依賴;
  3. 如果需要捧弃,實(shí)現(xiàn)相應(yīng)模塊的代碼類;

framework-common 的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
          http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>framework</artifactId>
        <groupId>com.zty</groupId>
        <!-- 繼用父項(xiàng)目的版本 -->
        <version>${zty-framework.version}</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>framework-common</artifactId>
    <groupId>com.zty</groupId>
    <!-- 繼用父項(xiàng)目的版本 -->
    <version>${zty-framework.version}</version>

    <dependencies>
        ...
    </dependencies>
</project>

最后嘴办,如果你對文章內(nèi)容存在疑惑买鸽,歡迎添加我的個(gè)人微信進(jìn)行交流,如果你覺得文章寫得不錯(cuò),給我點(diǎn)個(gè)贊吧 ^_^

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弹砚,一起剝皮案震驚了整個(gè)濱河市枢希,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茅诱,老刑警劉巖搬卒,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摆寄,居然都是意外死亡坯门,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門欠橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來现恼,“玉大人,你說我怎么就攤上這事痹升∑杈拢” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵察郁,是天一觀的道長。 經(jīng)常有香客問我稳捆,道長麦轰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任末荐,我火速辦了婚禮新锈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘块请。我一直安慰自己拳缠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布抖棘。 她就那樣靜靜地躺著狸涌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帕胆。 梳的紋絲不亂的頭發(fā)上懒豹,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音儒老,去河邊找鬼记餐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挖腰。 我是一名探鬼主播练湿,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼肥哎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了篡诽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碧信,沒想到半個(gè)月后街夭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呈枉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年猖辫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砚殿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辛萍,死狀恐怖羡藐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辉阶,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布启上,位于F島的核電站店印,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏按摘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一溅固、第九天 我趴在偏房一處隱蔽的房頂上張望兰珍。 院中可真熱鬧,春花似錦亮元、人聲如沸唠摹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藕赞。三九已至,卻和暖如春艇劫,著一層夾襖步出監(jiān)牢的瞬間惩激,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工顷蟀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骡技,地道東北人羞反。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓囤萤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親澄惊。 傳聞我的和親對象是個(gè)殘疾皇子富雅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359