SpringBoot 3 实战:虚拟线程、全局异常处理与 JWT 鉴权完整方案
一、前言SpringBoot 3 是 Java 后端的分水岭SpringBoot 3 基于 Spring 6要求 Java 17引入了 GraalVM Native Image、虚拟线程Project Loom、HTTP Interface 客户端等重大特性。本文从项目搭建到生产部署完整覆盖 SpringBoot 3 的核心实战。二、快速搭建项目2.1 最简 pom.xmlparent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId /dependency /dependencies2.2 application.yml 关键配置spring: datasource: url: jdbc:mysql://localhost:3306/mydb?useSSLfalsecharacterEncodingutf8 username: ${DB_USER} password: ${DB_PASS} hikari: maximum-pool-size: 20 minimum-idle: 5 jpa: hibernate: ddl-auto: validate show-sql: false # 生产环境关闭三、RESTful API 设计3.1 标准 Controller 写法RestController RequestMapping(/api/users) RequiredArgsConstructor public class UserController { private final UserService userService; GetMapping public PageResponseUserDTO list( RequestParam(defaultValue 0) int page, RequestParam(defaultValue 20) int size) { return userService.list(PageRequest.of(page, size)); } GetMapping(/{id}) public UserDTO getById(PathVariable Long id) { return userService.getById(id); } PostMapping ResponseStatus(HttpStatus.CREATED) public UserDTO create(Valid RequestBody CreateUserRequest req) { return userService.create(req); } PutMapping(/{id}) public UserDTO update(PathVariable Long id, Valid RequestBody UpdateUserRequest req) { return userService.update(id, req); } DeleteMapping(/{id}) ResponseStatus(HttpStatus.NO_CONTENT) public void delete(PathVariable Long id) { userService.delete(id); } }3.2 统一响应体Data Builder public class ApiResponseT { private int code; private String message; private T data; private long timestamp System.currentTimeMillis(); public static T ApiResponseT ok(T data) { return ApiResponse.Tbuilder().code(200).message(success).data(data).build(); } public static T ApiResponseT error(int code, String message) { return ApiResponse.Tbuilder().code(code).message(message).build(); } }四、虚拟线程Project LoomSpringBoot 3.2 原生支持虚拟线程I/O 密集型场景吞吐量可提升10倍。# application.yml 开启虚拟线程 spring: threads: virtual: enabled: true// 无需任何代码改动SpringBoot 自动将 Async 和请求处理线程切换为虚拟线程 Service public class UserService { Async public CompletableFutureUserDTO fetchAsync(Long id) { // 这里会跑在虚拟线程上即使线程阻塞也不会耗尽系统线程 return CompletableFuture.completedFuture(getById(id)); } }五、全局异常处理RestControllerAdvice Slf4j public class GlobalExceptionHandler { ExceptionHandler(NotFoundException.class) ResponseStatus(HttpStatus.NOT_FOUND) public ApiResponseVoid handleNotFound(NotFoundException e) { return ApiResponse.error(404, e.getMessage()); } ExceptionHandler(MethodArgumentNotValidException.class) ResponseStatus(HttpStatus.BAD_REQUEST) public ApiResponseMapString, String handleValidation(MethodArgumentNotValidException e) { MapString, String errors new HashMap(); e.getBindingResult().getFieldErrors() .forEach(err - errors.put(err.getField(), err.getDefaultMessage())); return ApiResponse.error(400, 参数校验失败); } ExceptionHandler(Exception.class) ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ApiResponseVoid handleGeneral(Exception e) { log.error(Unhandled error, e); return ApiResponse.error(500, 服务器内部错误); } }六、JWT 鉴权Component RequiredArgsConstructor public class JwtFilter extends OncePerRequestFilter { private final JwtUtil jwtUtil; Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String header request.getHeader(Authorization); if (header ! null header.startsWith(Bearer )) { String token header.substring(7); if (jwtUtil.isValid(token)) { var auth new UsernamePasswordAuthenticationToken( jwtUtil.getUsername(token), null, jwtUtil.getRoles(token)); SecurityContextHolder.getContext().setAuthentication(auth); } } chain.doFilter(request, response); } }七、生产部署FROM eclipse-temurin:21-jre-alpine WORKDIR /app COPY target/*.jar app.jar RUN addgroup -S app adduser -S app -G app USER app EXPOSE 8080 ENTRYPOINT [java, \ -XX:UseContainerSupport, \ -XX:MaxRAMPercentage75, \ -jar, app.jar]SpringBoot 3 实战关键点已经覆盖收藏备用有问题欢迎评论区交流。觉得有用的话点个赞收藏关注我持续更新优质技术内容标签springboot | java | 后端 | 实战 | 微服务