项目结构
一个标准的 Spring Boot Maven 项目结构如下,理解每一层的职责是写好代码的前提。
标准目录结构
demo/
├── pom.xml # Maven 依赖与构建配置
├── src/
│ ├── main/
│ │ ├── java/com/example/demo/
│ │ │ ├── DemoApplication.java # 启动类(必须在根包)
│ │ │ ├── controller/ # 控制层:接收请求、返回响应
│ │ │ ├── service/ # 业务层:核心业务逻辑
│ │ │ ├── mapper/ 或 repository/ # 数据访问层
│ │ │ ├── entity/ 或 model/ # 实体类 / 领域模型
│ │ │ ├── dto/ # 数据传输对象(请求/响应)
│ │ │ ├── config/ # 配置类(@Configuration)
│ │ │ ├── common/ # 通用类:统一返回、异常、常量
│ │ │ └── interceptor/ # 拦截器 / 过滤器
│ │ └── resources/
│ │ ├── application.yml # 主配置文件
│ │ ├── application-dev.yml # 开发环境配置
│ │ ├── application-prod.yml # 生产环境配置
│ │ ├── static/ # 静态资源(js/css/图片)
│ │ └── templates/ # 模板引擎页面(Thymeleaf 等)
│ └── test/java/... # 单元测试
└── target/ # 构建产物
分层职责
| 层 | 注解 | 职责 |
|---|---|---|
| Controller | @RestController | 接收 HTTP 请求,参数校验,调用 Service,返回结果 |
| Service | @Service | 业务逻辑、事务控制(@Transactional) |
| Mapper/Repository | @Mapper / @Repository | 数据库操作 |
| Entity | — | 与数据库表映射的实体 |
| DTO | — | 接口入参/出参对象,与 Entity 隔离 |
注意
Controller 只做「请求转发」,不要把业务逻辑写进 Controller;Entity 不要直接暴露给前端,应通过 DTO 转换。
调用链路
HTTP 请求
→ Controller(参数接收与校验)
→ Service(业务逻辑、事务)
→ Mapper/Repository(SQL / 数据访问)
→ 数据库
← DTO 封装返回
包扫描规则
@SpringBootApplication 默认扫描启动类所在包及其子包。因此:
- 启动类必须放在根包(如
com.example.demo)。 - 如果类放在扫描范围之外,需要显式指定:
@SpringBootApplication(scanBasePackages = {"com.example.demo", "com.other.module"})