# 1. Spring MVC 的线程模型(TaskExecutor) A Spring MVC 采用 event-loop 单线程模型 B 每个请求无限创建线程,无需配置 C TaskExecutor 与线程池无关,只是接口占位 D 传统 MVC 基于 Servlet 容器线程池 thread-per-request,异步场景用 TaskExecutor 解耦业务线程 ✓ 正确答案
# 2. Spring MVC 与虚拟线程的协作(JDK 21+) A spring.threads.virtual.enabled=true 开启后容器用虚拟线程处理请求,保持同步编程模型并获得高并发 ✓ 正确答案 B 开启虚拟线程后编程模型必须改为响应式 C 虚拟线程仍占用完整平台线程 D 虚拟线程只对 WebFlux 生效
# 3. DispatcherServlet 的请求处理流程,HandlerMapping、HandlerAdapter、HandlerInterceptor、ViewResolver 在责任链中的分工 A HandlerMapping 负责映射 URL 到处理器,HandlerAdapter 负责调用处理器,ViewResolver 负责解析视图 ✓ 正确答案 B HandlerAdapter 负责找到 URL 对应的处理器方法 C HandlerInterceptor 在响应渲染之后再执行 D DispatcherServlet 不参与请求分发
# 4. @Controller 与 @RestController 的差异 A @Controller 默认返回 JSON,@RestController 返回视图 B @RestController 是 @Controller 与 @ResponseBody 的组合,返回值直接序列化为数据 ✓ 正确答案 C 两者完全等价 D @RestController 不能用于 REST API
# 5. @ControllerAdvice 的多模块拆分 A 可按模块拆分多个 @ControllerAdvice,用 basePackages 限定范围、@Order 控制优先级 ✓ 正确答案 B 只能有一个 @ControllerAdvice,否则冲突 C @ControllerAdvice 只能处理异常,不能做数据绑定 D @ControllerAdvice 与模块无关,无法限定包范围
# 6. @ControllerAdvice/@ExceptionHandler 的全局异常处理在 Spring 7 中的优先级与作用范围 A 全局 @ExceptionHandler 优先于局部 @ExceptionHandler B @ControllerAdvice 只能处理运行时异常 C 异常处理器之间无优先级,随机生效 D 局部 @ExceptionHandler 优先于全局,同一异常按最精确类型匹配 ✓ 正确答案
# 7. @RequestMapping 与新版 @GetMapping/@PostMapping 在 Spring 7 中的注解元数据差异 A @GetMapping 是 @RequestMapping(method=GET) 的组合注解,语义更明确 ✓ 正确答案 B @GetMapping 支持所有 HTTP 方法 C 两者元数据完全不同 D @GetMapping 不能用于 Rest 接口
# 8. @RestControllerAdvice/@ControllerAdvice 与全局异常处理 A 它是 @ControllerAdvice 与 @ResponseBody 的组合,异常处理直接返回数据 ✓ 正确答案 B 它只能处理视图异常 C 它与 @ControllerAdvice 完全相同 D 它不能用于全局异常处理
# 9. Spring MVC 与 R2DBC 的反应式支持 A Spring MVC 中推荐大量使用 R2DBC 的 block() 阻塞等待 B R2DBC 面向阻塞 JDBC,与 WebFlux 无关 C R2DBC 是非阻塞关系数据库驱动,主要与 WebFlux 反应式栈配套使用 ✓ 正确答案 D R2DBC 不支持 Repository 抽象
# 10. Spring MVC 与 WebFlux 的选型边界 A 两者选型与业务无关 B WebFlux 必须用于所有高并发场景 C MVC 无法处理高并发 D 高并发 IO 密集、流式场景选 WebFlux;传统业务与生态成熟场景选 MVC,虚拟线程缩小了 WebFlux 优势 ✓ 正确答案
# 11. Spring MVC 中 WebSocket(@ServerEndpoint/TextWebSocketHandler)与 STOMP 消息代理的集成方式与边界 A WebSocket 是长连接传输层,STOMP 是上层消息协议,Spring 通过 WebSocketMessageBroker 桥接二者 ✓ 正确答案 B STOMP 是传输层,WebSocket 是消息协议 C @ServerEndpoint 与 TextWebSocketHandler 必须同时使用 D STOMP 与消息代理无关
# 12. Spring MVC 内容协商在 produces/consumes 与 HttpMessageConverter 链中的协作 A produces/consumes 决定请求响应媒体类型,HttpMessageConverter 完成实际序列化/反序列化 ✓ 正确答案 B HttpMessageConverter 决定媒体类型,produces 完成序列化 C 内容协商与 Accept 头无关 D 只有一种 HttpMessageConverter
# 13. Spring MVC 如何处理 MultipartFile 文件上传,大文件上传为何应改用流式(StreamingHttpOutputMessage)而非全量加载到内存 A MultipartFile.getBytes() 全量加载对所有文件都安全 B 文件上传与内存使用无关 C 大文件应通过 getInputStream() 流式逐块读写,避免全量加载到内存导致 OOM ✓ 正确答案 D MultipartResolver 不负责解析上传请求
# 14. Spring MVC 的 CORS 配置(@CrossOrigin/CorsConfigurationSource) A @CrossOrigin 注解级与 CorsConfigurationSource 全局配置均可,通过 CORS 头控制跨域 ✓ 正确答案 B 只能通过 @CrossOrigin 注解配置,无全局方式 C CORS 与浏览器无关,纯服务端配置 D CORS 配置无法限定路径
# 15. Spring MVC 的参数绑定与类型转换,ConversionService、Converter/Formatter 如何介入 @RequestParam/@PathVariable 绑定 A 参数绑定只做名称匹配,不进行类型转换 B Formatter 不能用于类型转换 C ConversionService 与 Converter 无关 D @RequestParam/@PathVariable 绑定经 ConversionService 完成类型转换,Converter/Formatter 可扩展 ✓ 正确答案
# 16. Servlet Filter 与 HandlerInterceptor 的执行顺序差异,以及它们分别适合做什么(字符集/鉴权/日志) A Interceptor 先于 Filter 执行 B 两者完全等价,作用相同 C Filter 属于 Servlet 容器层、先于 DispatcherServlet 执行,Interceptor 属于 Spring MVC 层、能访问 Handler 信息 ✓ 正确答案 D Filter 无法处理字符集编码
# 17. Spring MVC 在 Spring Boot 3.5+/4.x 对 Jakarta EE 10/11 API(Servlet 6.0/6.1)的兼容演进 A Spring 6 仍使用 javax.* 命名空间 B Spring 6 起使用 jakarta.* 命名空间,Boot 3.x 基于 Jakarta EE 10/Servlet 6.0,Boot 4.x 支持 Jakarta EE 11/Servlet 6.1 ✓ 正确答案 C Servlet 版本与 Spring Boot 无关 D Jakarta EE 11 与 Servlet 6.1 无关
# 18. Spring MVC 异步请求(DeferredResult/Callable)在 JDK 25 虚拟线程下的简化实现 A 虚拟线程阻塞代价低,同步阻塞调用即可获得高并发,简化了异步编程需求 ✓ 正确答案 B 虚拟线程下无法使用 DeferredResult C 异步请求必须用 Callable,不能用同步代码 D 虚拟线程不支持 Spring MVC
# 19. Spring MVC 静态资源处理(ResourceHttpRequestHandler)与 ETag/Last-Modified 缓存协商 A 静态资源不参与缓存协商 B ResourceHttpRequestHandler 处理静态资源,通过 ETag/Last-Modified 实现 304 缓存协商 ✓ 正确答案 C ETag 基于资源大小生成,与内容无关 D 静态资源只能由前端处理