spring mvc使用注意事项
下文笔者讲述spring mvc开发时的注意事项,如下所示
一、Controller设计规范
推荐做法: - 每个 Controller 职责单一,避免一个类处理过多业务逻辑。 - 使用 `@RequestMapping` 或其派生注解(如 `@GetMapping`, `@PostMapping`)清晰定义接口路径。 - 对于 RESTful API,优先使用 `@RestController`。 避免做法: - 不要在 Controller 中直接写复杂业务逻辑,应委托给 Service 层。 - 避免多个 Controller 映射相同的 URL,可能导致冲突。
二、参数绑定与校验
推荐做法: - 使用 `@RequestParam`、`@PathVariable`、`@RequestBody` 等明确指定参数来源。 - 对请求体进行校验时,使用 `@Valid` + `javax.validation.constraints.*` 注解。 - 异常统一处理:配合 `@ControllerAdvice` 和 `MethodArgumentNotValidException` 处理参数校验失败。 @PostMapping("/users") public ResponseEntity<?> createUser(@Valid @RequestBody UserDTO userDTO) { // ... }
三、异常处理机制
推荐做法: - 使用`@ExceptionHandler` 或 `@ControllerAdvice`统一处理异常 返回结构化错误信息。 - 自定义异常类型提高可读性 如`ResourceNotFoundException`、`InvalidRequestException`。 - 配合`@ResponseStatus`指定 HTTP 状态码。 @ExceptionHandler(ResourceNotFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public ErrorResponse handleResourceNotFound() { return new ErrorResponse("Resource not found"); }
四、视图与数据分离(适用于非REST场景)
推荐做法: -使用`ModelAndView` 或 `Model`传递数据给视图层。 -使用Thymeleaf、JSP、Freemarker等模板引擎渲染HTML页面 -避免在Controller中拼接HTML字符串
五、拦截器与过滤器使用
推荐做法: -全局拦截使用 `HandlerInterceptor` 实现,用于日志记录、权限验证等。 -若需更早介入请求流程(如静态资源),使用 `Filter`。 -注意拦截器注册路径匹配规则,避免误拦截。 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authInterceptor) .addPathPatterns("/**") .excludePathPatterns("/login", "/public/**"); } }
六、线程安全与状态管理
注意事项: -Controller 默认是单例的,不要在其中保存用户状态(如 session、临时变量)。 -如果需要存储会话状态,使用 `HttpSession` 或 Spring Session。 -避免在 Controller 中使用成员变量保存请求相关数据。
七、跨域与安全配置
推荐做法: -对于前后端分离项目,使用 `@CrossOrigin` 或全局配置允许跨域。 -使用 Spring Security 进行认证授权控制,防止未授权访问。 -对敏感接口启用 CSRF 保护(如表单提交)。
八、性能优化建议
优化点 | 建议 |
静态资源缓存 | 启用缓存头(Cache-Control)、GZIP 压缩 |
接口响应压缩 | 使用 GZIP 或 Deflate 压缩 JSON 响应 |
日志输出 | 控制日志级别,避免生产环境输出 DEBUG 日志 |
数据绑定性能 | 避免频繁创建大对象,合理使用 DTO |
九、部署与测试建议
- 使用 `@WebMvcTest` 单元测试 Controller,不加载整个上下文。 - 所有接口编写 Swagger 文档(如使用 SpringDoc OpenAPI)。 - 生产环境关闭 `spring.mvc.throw-exception-if-no-handler-found`,避免暴露调试信息。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。