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来构建微服务时,只需要做少量调整即可。