You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从零手动搭建MVC架构SpringBoot项目的结构组织建议咨询

手动搭建SpringBoot MVC项目的标准目录结构

不用IDE自动生成的情况下,只要严格遵循SpringBoot的默认扫描规则组织文件,手动搭建的项目和IDE生成的没有任何区别,核心是别放错配置文件、启动类的位置。

根目录核心文件

根目录是和src文件夹平级的最外层路径,必须放的核心文件如下:

  • pom.xml:Maven核心配置文件,SpringBoot启动加载依赖时会默认读取这个路径下的配置。手动编写时先引入spring-boot-starter-parent作为父依赖,再按需引入spring-boot-starter-web、数据库驱动、测试组件等依赖即可。
  • .gitignore:可选,使用Git做版本控制时放在根目录,配置忽略target编译产物、IDE本地配置文件等不需要提交的内容。

src目录分层规则

SpringBoot默认扫描src/main/java路径下,启动类所在包及其所有子包中的Spring组件,必须将标注@SpringBootApplication的启动类放在业务代码的最上层根包下,否则会出现Controller、Service无法被扫描到的问题。

src/main 主业务目录

这个目录下固定分为java(业务代码)和resources(配置/静态资源)两个子目录。

1. src/main/java 代码目录

包名按照域名反写的规则命名,全小写,比如个人项目可以用com.yourname.projectname作为根包,启动类直接放在这个根包下,不要嵌套到任何子包里。
根包下按照MVC分层职责建对应的子包,不要把所有类都堆在根包下:

  • controller:控制层,存放标注@Controller/@RestController的类,只负责接收前端请求、做基础参数校验、调用Service层处理业务、封装返回结果,不要在这里写核心业务逻辑或者数据库操作代码。
  • service:业务逻辑层,存放标注@Service的业务实现类,核心业务规则、多表联动逻辑、数据加工处理都放在这层;如果项目复杂度高,可以在service下建impl子包放实现类,接口单独放在service根目录。
  • mapper/repository:数据访问层,用MyBatis的话包名取mapper,存放标注@Mapper的数据库操作接口;用Spring Data JPA的话包名取repository,存放继承基础Repository的接口,这一层只负责和数据库做交互,不要掺杂业务逻辑。
  • 实体相关包:项目简单的话可以统一建model包放所有实体类,项目复杂可以拆分三个子包:
    • entity:和数据库表字段一一对应的实体类
    • dto:前端传参的接收对象
    • vo:返回给前端的视图对象
  • config:配置层,存放标注@Configuration的配置类,比如跨域配置、拦截器注册、JSON序列化配置、线程池配置等都放在这。
  • common:全局通用组件,比如统一响应结果封装、全局异常处理器、自定义业务异常类、常量定义等。
  • utils:通用工具类,比如JWT工具、加密工具、日期处理工具等无业务状态的通用方法集合。
  • interceptor:可选,存放自定义的SpringMVC拦截器实现类,不需要拦截器可以不建这个包。

对应的目录树参考如下:

src/main/java
└── com/example/yourproject
    ├── YourProjectApplication.java // 启动类,固定放在根包下
    ├── controller
    │   └── UserController.java
    ├── service
    │   ├── impl
    │   │   └── UserServiceImpl.java
    │   └── UserService.java
    ├── mapper
    │   └── UserMapper.java
    ├── entity
    │   └── User.java
    ├── dto
    │   └── UserLoginDTO.java
    ├── vo
    │   └── UserInfoVO.java
    ├── config
    │   └── WebMvcConfig.java
    ├── common
    │   ├── R.java // 统一返回结果封装
    │   ├── BusinessException.java
    │   └── GlobalExceptionHandler.java
    └── utils
        └── JwtUtils.java

2. src/main/resources 资源目录

SpringBoot会默认读取这个路径下的配置文件,不要把配置文件放到其他路径:

  • 应用配置文件:直接放在resources根目录,命名为application.yml或者application.properties,服务端口、数据库连接信息、第三方配置等都写在这;多环境配置可以新建application-dev.yml(开发环境)、application-prod.yml(生产环境)这类命名的文件,通过主配置的spring.profiles.active指定激活环境。
  • static:静态资源目录,存放css、js、图片、静态html等不需要经过视图解析的资源,SpringBoot默认会映射这个目录下的资源访问路径。
  • templates:模板文件目录,用Thymeleaf、FreeMarker等模板引擎时,对应的模板文件放在这。
  • mapper:可选,用MyBatis如果把SQL写在XML文件里,就把XML映射文件放在这个目录下,同时在application配置里指定mybatis.mapper-locations: classpath:mapper/*.xml即可。

src/test 测试代码目录

这个目录下的包结构和src/main/java保持一致即可,测试类标注@SpringBootTest注解,专门写单元测试、集成测试代码,不要把测试逻辑混到主业务代码里。

手动搭建避坑提示:

  1. 不要把启动类放到controller、service这类子包里,否则SpringBoot默认扫描范围不覆盖其他子包,会出现请求404、找不到Bean的报错
  2. 如果编辑器没有自动识别目录类型,手动把src/main/java标记为Sources Root、src/main/resources标记为Resources Root、src/test/java标记为Test Sources Root即可,否则会出现编译找不到文件的问题
  3. 分层时严格遵守职责边界,不要跨层直接调用,比如不要在Controller里直接注入Mapper操作数据库,后续维护成本会极高
  4. 所有包名、类名遵循Java命名规范,包名全小写,类名用大驼峰,不要用中文或者特殊字符命名

内容的提问来源于stack exchange,提问作者Will M.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:18:41