這篇文章先會討論什么是"框架",然后向你展示一個基于 maven 特性搭建的自制開發(fā)框架與該框架的使用示例,最后將這個自制框架的搭建過程整理給你。這篇文章適用于對maven有足夠了解的讀者,如果你還不認(rèn)識maven,歡迎閱讀我的另一篇文章:
內(nèi)容預(yù)覽:
- 討論什么是“框架”
- 展示一個簡單的基于 maven 特性搭建的自制框架
- 展示上述自制框架的使用示例
- 自制框架的搭建過程
一、什么是框架
概念
筆者認(rèn)為,所謂的框架,是指一套抽象的規(guī)范,符合某一框架的規(guī)范,則可稱為使用了這一框架或者基于這一框架。
舉個例子,maven項(xiàng)目要求在根路徑有一個配置文件 pom.xml,還要求項(xiàng)目源代碼、項(xiàng)目測試代碼、項(xiàng)目靜態(tài)資源必須放置到指定的目錄里;再舉個例子,Spring項(xiàng)目需要定義或配置各種bean,注冊到容器里的bean,可以被依賴注入注解來管理使用,完成IoC;最后再舉個例子,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ī)范。主要功能如下:
- 簡化 Spring 項(xiàng)目搭建過程。按功能類型封裝常用功能依賴包,統(tǒng)一管理,對外提供完整的"依賴包套餐"。只需引入 zty-framework 的相應(yīng)模塊,即可完成對某一功能類型所需的所有依賴包的導(dǎo)入過程,既避免了重復(fù)引入依賴的人工操作,也大大減少修改依賴引入所需的工作量。
- 定義規(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)容則可以理解為——由幾個小積木組建成的模塊。
框架內(nèi)容展示
首先是 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 依賴圖如下:

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

對于負(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 依賴圖如下:

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

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

以上只是筆者搭建的示例,framework 各模塊的依賴可以按需選擇、調(diào)整。
使用示例
以實(shí)際項(xiàng)目中“賬號模塊”的實(shí)現(xiàn)作為 zty-framework 的使用示例,帶你更近一步感受 zty-framework 的便利。
首先是創(chuàng)建負(fù)責(zé)定義公用實(shí)體類的 account-common 模塊,引入 framework-common 依賴:

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

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

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

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

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

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

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

搭建過程
- 創(chuàng)建 maven 空工程,命名為 framework;
- 將工程 framework 的 pom.xml 的<packaging>改為
pom; - 在工程 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>
- 分別創(chuàng)建框架子模塊 framework-common、framework-bo、framework-web 和 framework-springboot-app,并在<parent>標(biāo)簽里使他們繼承于 framework;
- 在相應(yīng)的模塊里引入依賴;
- 如果需要,實(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)容存在疑惑,歡迎添加我的個人微信進(jìn)行交流,如果你覺得文章寫得不錯,給我點(diǎn)個贊吧 ^_^