SpringBoot3 框架快速搭建与项目工程详解

 更新时间:2026年02月12日 10:03:48   作者:一直都在572  
本文将从项目搭建、核心配置、分层开发、统一返回与异常处理等维度,详细讲解SpringBoot3项目的构建与工程设计,帮助开发者快速上手,感兴趣的朋友跟随小编一起看看吧

在后端开发领域,SpringBoot 凭借其 “约定优于配置” 的核心思想,极大简化了 Spring 应用的搭建与开发流程。SpringBoot3 作为其最新稳定版本,不仅兼容 Spring 6 的核心特性,还在性能优化、原生镜像支持等方面有显著提升。本文将从项目搭建、核心配置、分层开发、统一返回与异常处理等维度,详细讲解 SpringBoot3 项目的构建与工程设计,帮助开发者快速上手。

一、项目整体架构设计

1. 技术栈选型

1.1 后端技术栈

核心框架:SpringBoot3(基于 Java17,简化 Spring 配置,提升开发效率)

数据持久层:MyBatis-Plus(简化 MySQL 操作,提供 CRUD 接口、分页插件等)

数据库:MySQL8.0(存储用户核心数据)

工具类:Lombok(简化实体类代码)、FastJSON(JSON 数据序列化 / 反序列化)

接口文档:Knife4j(基于 Swagger,自动生成接口文档,方便前后端联调)

1.2 前端技术栈

核心框架:Vue3(Composition API 语法,响应式更高效)

UI 组件库:Element-Plus(适配 Vue3 的 UI 组件库,提供表格、表单、弹窗等常用组件)

网络请求:Axios(封装请求拦截器、响应拦截器,统一处理接口请求)

路由管理:Vue Router4(实现页面跳转与路由守卫)

状态管理:Pinia(Vue3 官方推荐,替代 Vuex,轻量高效)

2. 架构流程图

前端(Vue3 + Element-Plus)
    │
    ├─ 页面组件(用户列表、新增/编辑弹窗)
    ├─ 网络请求(Axios 封装)
    ├─ 路由管理(Vue Router)
    └─ 状态管理(Pinia)
        │
        ▼
HTTP 请求(RESTful API)
        │
        ▼
后端(SpringBoot3)
    │
    ├─ 控制层(Controller:接收请求、返回响应)
    ├─ 服务层(Service:业务逻辑处理)
    ├─ 持久层(Mapper:MyBatis-Plus 数据访问)
    ├─ 实体层(Entity:数据库表映射)
    ├─ 公共组件(统一返回、全局异常处理)
    └─ 接口文档(Knife4j)
        │
        ▼
数据库(MySQL8.0)

3. 核心功能模块

用户列表展示:表格形式展示用户 ID、用户名、生日、性别、地址等信息,支持分页加载

条件查询功能:根据用户名、地址筛选用户数据,支持清空查询条件

新增用户功能:通过弹窗表单收集用户信息,表单校验后提交至后端

编辑用户功能:回显选中用户信息至弹窗,修改后提交更新

删除功能:支持单条用户删除、批量用户删除,删除前弹出确认提示

数据格式化:对生日字段进行统一格式化(年 - 月 - 日),提升页面可读性

二、IDEA创建Spring Boot

删除无用的文件

然后在pom.xml文件当中进行配置

配置maven

选择 pom.xml 然后加载依赖

三、Spring boot内容简介

四、pom.xml文件

spring-boot-dependencies:核心依赖在父工程里面

我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本

启动器

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter</artifactId>
</dependency>

启动器:说白了就是SpringBoot启动的场景

比如Spring-boot-srarter-web,他会帮助我们自动导入web环境所有的依赖

SpringBoot会将所有的功能场景,都变成一个个的启动器

我们需要使用的功能,只需要找到他们的启动器便可以进行使用

启动成功

加载web启动

<!--加载web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

controller层

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String getHello(){
        return "Hello world";
    }
}

配置文件

server.port=8081

访问地址:http://localhost:8081/hello

五、统一返回包装类 Result

包装类:作用是统一后端返回的数据类型,code 是作为前端判断请求成功的依据,msg 是错误的信息,data 是返回给前端的数据

public class Result {
    private String code;
    private Object data;
    private String msg;
    public static Result success() {
        Result result = new Result();
        result.setCode("200");
        result.setMsg("请求成功");
        return result;
    }
    public static Result success(Object data) {
        Result result = new Result();
        result.setCode("200");
        result.setData(data);
        result.setMsg("请求成功");
        return result;
    }
    public static Result error(String msg) {
        Result result = new Result();
        result.setCode("500");
        result.setMsg(msg);
        return result;
    }
    public static Result error(String code, String msg) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

更改返回的数据形式

六、500 错误:常见的系统的错误

抛出这些错误非常不友好,我们应该使用统一的处理方式

配置日志

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

@ControllerAdvice("com.qcby.springboot.controller")
public class GlobalExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    @ExceptionHandler(Exception.class)
    @ResponseBody // 将result对象转换成 json的格式
    public Result error(Exception e) {
        log.error("系统异常", e);
        return Result.error("系统异常");
    }
}

系统异常怎么办

你得看你的控制台,然后找到报错的代码位置,具体去修正代码

自定义异常

/**
 * 自定义异常
 * 运行时异常
 */
public class CustomerException extends RuntimeException {
    private String code;
    private String msg;
    public CustomerException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public CustomerException(String msg) {
        this.code = "500";
        this.msg = msg;
    }
    public CustomerException() {}
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

最终版全局异常

/**
 * 全局异常捕获器
 * @ControllerAdvice("com.qcby.springboot.controller") 
 *                 指定该全局异常处理器作用于 com.qcby.springboot.controller 包下的控制器。
 */
@ControllerAdvice("com.qcby.springboot.controller")
public class GlobalExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    /**
     * 全局异常捕获器
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)  
    @ResponseBody // 将result对象转换成 json的格式
    public Result error(Exception e) {
        log.error("系统异常", e);
        return Result.error("系统异常");
    }
    /**
     * 自定义异常捕获器
     * @param e
     * @return
     */
    @ExceptionHandler(CustomerException.class)
    @ResponseBody // 将result对象转换成 json的格式
    public Result customerError(CustomerException e) {
        log.error("自定义错误", e);
        return Result.error(e.getCode(), e.getMsg());
    }
}

测试自定义异常

controller测试接口

@GetMapping("/admin")
public Result admin(String name) {
    String admin = adminService.admin(name);
    return Result.success(admin);
}

service

package com.example.service;
import com.example.exception.CustomerException;
import org.springframework.stereotype.Service;
@Service
public class AdminService {
    public String admin(String name) {
        if ("admin".equals(name)) {
            return "admin";
        } else {
            throw new CustomerException("账号错误");
        }
    }
}

到此这篇关于SpringBoot3 框架快速搭建与项目工程详解的文章就介绍到这了,更多相关SpringBoot内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈MyBatis通用Mapper实现原理

    浅谈MyBatis通用Mapper实现原理

    这篇文章主要介绍了浅谈MyBatis通用Mapper实现原理,本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程。感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 详解Java并发包基石AQS

    详解Java并发包基石AQS

    Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock、Semaphore,它们的实现都用到了一个共同的基类--AbstractQueuedSynchronizer,简称AQS。本文将从几个方面来详细介绍:基本实现原理、自定义同步器、源码分析
    2021-06-06
  • Java中的CAS锁机制(无锁、自旋锁、乐观锁、轻量级锁)详解

    Java中的CAS锁机制(无锁、自旋锁、乐观锁、轻量级锁)详解

    这篇文章主要介绍了Java中的CAS锁机制(无锁、自旋锁、乐观锁、轻量级锁)详解,CAS算法的作用是解决多线程条件下使用锁造成性能损耗问题的算法,保证了原子性,这个原子操作是由CPU来完成的,需要的朋友可以参考下
    2024-01-01
  • 详解Java中的mapstruct插件使用

    详解Java中的mapstruct插件使用

    mapstruct 的插件是专门用来处理 domin 实体类与 model 类的属性映射的,我们只需定义 mapper 接口,mapstruct 在编译的时候就会自动的帮我们实现这个映射接口,避免了麻烦复杂的映射实现,对Java mapstruct使用相关知识感兴趣的朋友一起看看吧
    2022-04-04
  • 使用JVM常用GC日志打印参数

    使用JVM常用GC日志打印参数

    这篇文章主要介绍了使用JVM常用GC日志打印参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring Boot如何通过自定义注解实现日志打印详解

    Spring Boot如何通过自定义注解实现日志打印详解

    这篇文章主要给大家介绍了关于Spring Boot如何通过自定义注解实现日志打印的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • eclipse 如何创建 user library 方法详解

    eclipse 如何创建 user library 方法详解

    这篇文章主要介绍了eclipse 如何创建 user library 方法详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Spring Boot利用Docker快速部署项目的完整步骤

    Spring Boot利用Docker快速部署项目的完整步骤

    这篇文章主要给大家介绍了关于Spring Boot利用Docker快速部署项目的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • 解析Spring Mvc Long类型精度丢失问题

    解析Spring Mvc Long类型精度丢失问题

    在平时开发过程中,经常会使用long类型作为id的类型,但是在使用过程中会导致long类型数据转换为number类型时的后两位变为0,今天小编给大家分享Spring Mvc Long类型精度丢失问题,需要的朋友参考下吧
    2021-06-06
  • Java日常练习题,每天进步一点点(31)

    Java日常练习题,每天进步一点点(31)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07

最新评论