Spring Boot项目的包结构有多种组织方式,主要取决于项目规模和团队规范。以下是几种常见的包结构组织方式:
一、按功能模块划分(垂直分层)
这是最经典的分层架构,适合中小型项目:
com.example.project
├── config/ # 配置类
│ ├── WebConfig.java
│ ├── SecurityConfig.java
│ └── DatabaseConfig.java
├── controller/ # 控制层
│ ├── UserController.java
│ └── ProductController.java
├── service/ # 服务层
│ ├── UserService.java
│ ├── impl/
│ │ ├── UserServiceImpl.java
│ │ └── ProductServiceImpl.java
│ └── ProductService.java
├── repository/ # 数据访问层
│ ├── UserRepository.java
│ └── ProductRepository.java
├── model/ # 实体类
│ ├── entity/ # 数据库实体
│ │ ├── User.java
│ │ └── Product.java
│ ├── dto/ # 数据传输对象
│ │ ├── UserDTO.java
│ │ └── ProductDTO.java
│ └── vo/ # 视图对象
│ ├── UserVO.java
│ └── ProductVO.java
├── exception/ # 异常处理
│ ├── GlobalExceptionHandler.java
│ └── BusinessException.java
└── utils/ # 工具类
├── DateUtils.java
└── StringUtils.java
二、按业务模块划分(水平切分)
适合中大型项目,模块化程度高:
com.example.project
├── common/ # 公共模块
│ ├── config/
│ ├── exception/
│ ├── utils/
│ └── constant/
├── user/ # 用户模块
│ ├── controller/
│ ├── service/
│ ├── repository/
│ ├── model/
│ │ ├── entity/
│ │ ├── dto/
│ │ └── vo/
│ └── UserApplication.java
├── product/ # 产品模块
│ ├── controller/
│ ├── service/
│ ├── repository/
│ ├── model/
│ └── ProductApplication.java
├── order/ # 订单模块
│ ├── controller/
│ ├── service/
│ ├── repository/
│ ├── model/
│ └── OrderApplication.java
└── ProjectApplication.java
三、简单项目结构
适合快速原型、小型项目:
com.example.project
├── controller/
│ ├── UserController.java
│ └── ProductController.java
├── service/
│ ├── UserService.java
│ └── ProductService.java
├── repository/
│ ├── UserRepository.java
│ └── ProductRepository.java
├── entity/ # 合并实体类
│ ├── User.java
│ └── Product.java
├── dto/ # 简化数据传输对象
│ └── UserDTO.java
└── Application.java
四、DDD领域驱动设计结构
适合复杂业务系统:
com.example.project
├── infrastructure/ # 基础设施层
│ ├── persistence/ # 持久化
│ ├── client/ # 外部服务调用
│ └── config/
├── application/ # 应用层
│ ├── service/
│ ├── dto/
│ └── event/
├── domain/ # 领域层
│ ├── model/ # 领域模型
│ │ ├── user/
│ │ └── order/
│ ├── service/ # 领域服务
│ ├── repository/ # 仓储接口
│ └── event/ # 领域事件
├── interfaces/ # 接口层
│ ├── web/ # Web接口
│ ├── rpc/ # RPC接口
│ └── mq/ # 消息接口
└── Application.java
五、推荐的最佳实践
1. 混合结构(推荐)
com.example.project
├── common/
│ ├── config/ # 公共配置
│ ├── exception/ # 异常处理
│ ├── constant/ # 常量
│ ├── enums/ # 枚举
│ ├── util/ # 工具类
│ └── response/ # 统一响应
├── modules/
│ ├── user/ # 用户模块
│ │ ├── controller/
│ │ ├── service/
│ │ ├── dao/ # 或repository
│ │ ├── entity/
│ │ ├── dto/
│ │ ├── vo/
│ │ └── mapper/ # MyBatis Mapper
│ └── product/ # 产品模块
└── Application.java
2. 目录结构示例
// 示例代码结构
src/main/java/com/example/
├── Application.java
├── config/
│ ├── SwaggerConfig.java
│ ├── SecurityConfig.java
│ └── RedisConfig.java
├── common/
│ ├── BaseEntity.java
│ ├── Result.java
│ └── PageResult.java
├── modules/
│ ├── user/
│ │ ├── UserController.java
│ │ ├── UserService.java
│ │ ├── UserServiceImpl.java
│ │ ├── UserRepository.java
│ │ ├── User.java
│ │ ├── UserDTO.java
│ │ └── UserVO.java
│ └── order/
│ ├── OrderController.java
│ └── ...
└── utils/
├── DateUtil.java
└── JsonUtil.java
六、选择建议
-
简单项目:使用功能模块划分,结构清晰
-
中型项目:使用混合结构,按业务模块划分
-
大型项目:使用DDD或微服务架构,每个模块独立
-
团队协作:统一规范,约定大于配置
七、常用规范
-
包名全小写
-
避免循环依赖
-
单一职责原则
-
控制层保持简洁
-
服务层处理业务逻辑
-
数据访问层只做数据操作
选择哪种结构取决于项目规模、团队习惯和业务复杂度。对于大多数项目,推荐使用混合结构,既保持灵活性又具有扩展性。