从零手动搭建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注解,专门写单元测试、集成测试代码,不要把测试逻辑混到主业务代码里。
手动搭建避坑提示:
- 不要把启动类放到controller、service这类子包里,否则SpringBoot默认扫描范围不覆盖其他子包,会出现请求404、找不到Bean的报错
- 如果编辑器没有自动识别目录类型,手动把
src/main/java标记为Sources Root、src/main/resources标记为Resources Root、src/test/java标记为Test Sources Root即可,否则会出现编译找不到文件的问题- 分层时严格遵守职责边界,不要跨层直接调用,比如不要在Controller里直接注入Mapper操作数据库,后续维护成本会极高
- 所有包名、类名遵循Java命名规范,包名全小写,类名用大驼峰,不要用中文或者特殊字符命名
内容的提问来源于stack exchange,提问作者Will M.
相关产品推荐
相关产品推荐

