Project structure layout
project structure layout
Problem
經常會在專案中看到很糟糕的專案結構與專案組織方式,比如程式碼可讀性不高、組織結構詭異、命名言不達意且前後不致等。
前段時間看到阿里巴巴出了一個關於Java程式碼規範的小冊子,感覺非常的好,但是很多時候,並不是所有的專案都是基於大型分散式架構的,所以這裡針對小型專案程式碼組織方式做了一些調整,並基於目前最流行的Spring boot專案結構來展開。
Resolve
下面是一個全新的專案結構圖:
現專案結構圖簡要說明如下:
Item | Description | Remarks |
---|---|---|
xihu | 專案根目錄 | 無 |
README.md | 引導說明文件 | 無 |
doc | 文件目錄 | 無 |
CHANGELOG | 釋出版本日誌 | 無 |
pom.xml | 專案物件模型,名稱不可更改,具體可參見maven規範 | 無 |
src/main/java | java原始碼目錄,按maven規範,裡面全是*.java檔案 | 無 |
src/main/sources | 配置檔案根目錄 | 無 |
src/test/java | 測試用例java專案根目錄 | 無 |
src/test/sources | 測試用例配置檔案根目錄 | 無 |
com.qwfys.app.xihu | 包根路徑 | 無 |
com.qwfys.app.xihu.controller | 業務控制器層包路徑 | DepartmentController |
com.qwfys.app.xihu.controller.view | 業務控制器層Java Bean包路徑 | DepartmentView |
com.qwfys.app.xihu.business | 業務邏輯層包路徑 | 無 |
com.qwfys.app.xihu.business.spec | 業務邏輯層業務邏輯介面包路徑 | DepartmentBusiness |
com.qwfys.app.xihu.business.impl | 業務邏輯層業務邏輯實現包路徑 | DepartmentBusinessImpl |
com.qwfys.app.xihu.business.model | 業務邏輯層Java Bean包路徑 | DepartmentModel |
com.qwfys.app.xihu.data | 資料訪問層包路徑 | 無 |
com.qwfys.app.xihu.data.repository | 資料訪問層主入口包路徑 | 無 |
com.qwfys.app.xihu.data.repository.spec | 資料訪問層主入口介面包路徑 | DepartmentRepository |
com.qwfys.app.xihu.data.repository.impl | 資料訪問層主入口實現包路徑 | DepartmentRepositoryImpl |
com.qwfys.app.xihu.data.mapper | 資料訪問層MyBatis對映包路徑 | DepartmentMaper |
com.qwfys.app.xihu.data.domain | 資料訪問層Java Bean對映包路徑 | DepartmentDomain |
com.qwfys.app.xihu.data.redis.spec | 資料訪問層Redis介面包路徑 | DepartmentRedis |
com.qwfys.app.xihu.data.redis.impl | 資料訪問層Redis實現包路徑 | DepartmentRedisImpl |
com.qwfys.app.xihu.data.mongo.spec | 資料訪問層Mongo介面包路徑 | DepartmentMongo |
com.qwfys.app.xihu.data.mongo.impl | 資料訪問層Mongo實現包路徑 | DepartmentMongoImpl |
com.qwfys.app.xihu.common | 通用程式碼包路徑 | 無 |
com.qwfys.app.xihu.common.base | 通用程式碼基類包路徑 | 無 |
com.qwfys.app.xihu.common.constant | 通用程式碼常量包路徑 | 無 |
com.qwfys.app.xihu.common.enums | 通用程式碼列舉包路徑 | 無 |
com.qwfys.app.xihu.common.exception | 通用程式碼業務異常包路徑 | 無 |
com.qwfys.app.xihu.common.util | 通用程式碼工具類包路徑 | 無 |
com.qwfys.app.xihu.config | 配置程式碼包路徑 | 無 |
com.qwfys.app.xihu.web | servelet相關包路徑 | 無 |
com.qwfys.app.xihu.converter | 轉換相關包路徑 | 無 |
com.qwfys.app.xihu.XihuApplication | 專案入口 | 無 |
com.qwfys.app.xihu.XihuApplicationTests | 測試樣例 | 無 |
application.yml | 配置檔案 | 無 |
application-snapshot.yml | 每日構建環境配置檔案 | 無 |
application-alpha.yml | alpha環境配置檔案 | 無 |
application-beta.yml | beta環境配置檔案 | 無 |
application-release.yml | release環境配置檔案 | 無 |
com/qwfys/app/xihu/data/mapper | MyBatis SQL-Mapping配置檔案目錄 | 無 |
config/mybatis/mybatis-config.xml | Mybatis配置檔案 | 無 |
static | spring boot靜態資源目錄 | 無 |
template | spring boot模板目錄 | 無 |
logback.xml | logback日誌系統配置檔案 | 無 |
Feature
1、整個專案結構的設計主要針是對前後端不分離的情形的。對於前後端分離的情形來說,整個專案結構也是完全適用的,無非是將前端靜態資源相關東西拿掉,與此同時藉助Swagger UI之類的元件對外輸出介面文件,並對外提供標準的Restful風格的api即可。
2、整個專案結構的設計主要參照了敏捷開發的理念,遵循程式碼即是文件的專案開發理念,專案文件通過README.md、Swagger UI、CHANGELOG展開。其中,README.md主要用於對專案做整體性描述;Swagger UI主要用於輸出專案介面文件;CHANGELOG主要用於記錄專案版本之間的功能變化。
3、整個專案結構的設計在命名上參考了領域模型設計的理念,採用後續法來清晰整個專案的結構,如User這個領域物件,在專案中各層相關的元素有UserController、UserBusiness、UserBusinessImpl、UserRepository、UserMapper、UserMapper.xml、UserDomain、UserModel、UserView等,後續有特定的語境、語意。
4、整個專案結構的設計在Java包的命名上採用了應用即是服務的設計的理念,包的命名由組織名.層次型別.應用名做為包的根路徑,如com.qwfys為組織名,app代表業務應用,如果是基礎框架,則是framework,xihu為應用名,也就是說,xihu是一個可以獨立部署的服務。
5、整個專案結構的設計部署上參考了每日構建(snapshot)、內測一(alpha)、內測二(beta)、釋出(release)的研發流程,針對研發活動的每一階段都有與之對應的執行環境與之對應,專案在不同的環境中啟動只要新增不同的啟動引數即可。
eg. 要在beta環境中以原始碼方式啟動專案,可以用如下方式啟動:
[email protected] ~/ $ cd project/com/qwfys/xihu
[email protected]:~/Public/project/com/qwfys/xihu$
[email protected]:~/Public/project/com/qwfys/xihu$ mvn spring-boot:run -Dspring-boot.run.profiles=beta
eg. 要在beta環境中以jar包方式啟動專案,可以用如下方式啟動:
[email protected] ~/ $ cd project/com/qwfys/xihu
[email protected]:~/Public/project/com/qwfys/xihu$
[email protected]:~/Public/project/com/qwfys/xihu$ mvn clean install -Dmaven.test.skip=true
[email protected]:~/Public/project/com/qwfys/xihu$ java -jar target/xihu-0.0.1-SNAPSHOT.jar --spring.profiles.active=test
Summary
這裡針對小型專案結構參照Spring boot、領域驅動模型、敏捷開發、應用即是服務等理念做了一個設計,兼顧到了前後端分離與前後端不分離兩種情型,讓專案結構更清晰。
當下微服務架構已經深入人心,對於微服務的專案來講,這種專案結構也是適用的,結合Spring Cloud來構建微服務時,只需要做少量調整即可。