4. Spring Boot 答辩

本章收录 63 道老师常问问题,高频题靠前。回答时尽量结合自己的项目举例。

1. SpringBoot自动配置核心原理?

基于SPI机制+条件注解实现。项目启动时自动扫描classpath下的自动配置类,根据项目引入的依赖jar包,结合@Conditional条件注解,自动加载符合环境的默认配置,无需手动配置,实现开箱即用,开发者可通过yml配置文件自定义覆盖默认参数。

2. 项目跨域问题产生原因及三种解决方案?

  1. 跨域是浏览器同源策略限制,协议、域名、端口任一不同即触发跨域。解决方案:一是方法级注解@CrossOrigin
  2. 二是编写全局跨域配置类,统一拦截所有接口
  3. 三是前端代理跨域,项目采用全局配置类方式,统一规范、维护性更强。

3. MyBatis-Plus对比原生MyBatis优势?

MyBatis-Plus无侵入、零损耗,在MyBatis基础上增强功能,无需手动编写CRUD SQL,内置通用Mapper、通用Service、分页插件、条件构造器、主键生成策略,极大简化数据库操作代码,减少重复代码,开发效率翻倍。

4. 什么是 Spring Boot?核心优势?

  1. 约定优于配置:减少 XML,开箱即用
  2. 起步依赖:starter 聚合常用依赖
  3. 内嵌容器:jar 即可运行,部署简单
  4. 自动配置:按 classpath 条件装配

5. 自动配置原理是什么?

启动时加载 AutoConfiguration,结合 @Conditional* 判断是否生效;可用 spring-boot-autoconfigure 与排除项控制。

6. 一次请求经过哪些组件?

Filter → Interceptor → Controller → Service → Mapper → DB,统一异常与返回包装后回前端。

7. @SpringBootApplication注解底层组成?

  1. 启动注解:@SpringBootApplication
  2. Web注解:@RestController、@RequestMapping、@RequestBody
  3. 注入注解:@Autowired、@Resource
  4. 配置注解:@Configuration、@Bean
  5. 事务注解:@Transactional,分工明确,适配项目开发。

8. 如何做多环境配置?

application-dev/prod.yml + spring.profiles.active;敏感信息用环境变量,不提交仓库。

9. 事务何时失效?

事务保证一组 SQL 同成功同失败,Spring @Transactional 或数据库 BEGIN/COMMIT。

  1. 下单扣库存典型场景
  2. 隔离级别影响并发问题
  3. 答辩指出哪些 Service 加了事务

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

10. JWT 与 Session 如何选?

Session 在服务端保存登录态,Cookie 携带 JSESSIONID,拦截器校验是否登录。

  1. 登录成功写入 userId/role 等信息
  2. 集群需 Redis 共享 Session 或改 JWT
  3. 答辩能口述登录→访问受保护接口流程

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

11. MyBatis-Plus 用了哪些能力?

分页限制单次查询数据量,常用 PageHelper 或 LIMIT offset,size。

  1. 前端传 pageNum/pageSize,后端封装 PageInfo
  2. 深分页 offset 过大性能差,可延迟关联优化
  3. 答辩演示列表页分页接口与 SQL

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

12. SpringBoot全局异常处理怎么做的?

项目使用@RestControllerAdvice全局异常处理注解,结合@ExceptionHandler捕获全局异常,统一封装异常返回结果,避免前端展示原生报错信息,提升系统稳定性和用户体验。

13. 如何讲清登录流程?

登录流程:提交账号密码→后端校验→写 Session/签发 JWT→后续请求带凭证→拦截器鉴权。

  1. 密码 BCrypt 比对,不明文传输存储
  2. 失败次数限制与验证码可选
  3. 答辩建议画简单时序图

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

14. 内嵌 Tomcat?

Spring Boot 内嵌 Tomcat,jar 包即含 Web 容器,无需外置安装。

  1. 可换 Undertow/Jetty
  2. server.port 配置端口
  3. 答辩对比 SSM 外置 Tomcat

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

15. starter 是什么?

Starter 是 Spring Boot 起步依赖,聚合常用 jar 与自动配置。

  1. 如 spring-boot-starter-web 引入 MVC、Tomcat、Jackson
  2. 约定优于配置,减少 pom 手工维护
  3. 答辩可对照 pom.xml 说明引入了哪些能力

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

16. yml和properties配置文件优先级、区别?

properties优先级高于yml,相同配置下properties会覆盖yml。properties是键值对格式,层级模糊、配置繁琐;yml是树形层级配置,结构清晰、可读性强,支持对象、数组、多级嵌套配置,更适合SpringBoot项目开发。

17. @ConfigurationProperties?

@ConfigurationProperties 将配置前缀批量绑定到 Java 对象,类型安全可读。

  1. 比 scattered @Value 更易维护
  2. 配合 @EnableConfigurationProperties 注册
  3. 答辩可展示自定义配置类

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

18. @Value 注意?

@Value 注入单个配置项,简单场景可用;复杂结构推荐 @ConfigurationProperties。

  1. 占位符 ${key:default}
  2. SpEL 表达式支持
  3. 答辩说明配置文件对应关系

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

19. Bean 注入方式?

依赖注入(DI)由容器装配依赖,替代手动 new,实现解耦。

  1. 构造器注入更推荐:依赖明确、便于测试、避免空指针
  2. @Autowired/@Resource 可用于字段或 setter
  3. 项目中 Controller 注入 Service,Service 注入 Mapper

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

20. 循环依赖?

循环依赖指 Bean 相互注入;Spring 对单例 setter/字段注入可用三级缓存解决。

  1. 构造器循环依赖无法启动,应重构
  2. 设计时避免 Service 互相调用形成环
  3. 答辩强调良好分层可规避

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

21. AOP 日志?

日志用于排错、审计与性能分析,常用 SLF4J + Logback/Log4j2。

  1. 分级别:ERROR/WARN/INFO/DEBUG
  2. 关键业务、异常、慢接口应记录
  3. 生产避免打印敏感信息与过量 DEBUG

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

22. 拦截器做什么?

拦截器(Interceptor)在 DispatcherServlet 与 Controller 之间,可获取 Handler 做登录/权限校验。

  1. 比 Filter 更贴近 Spring MVC
  2. preHandle/postHandle/afterCompletion 三阶段
  3. 答辩演示未登录跳转逻辑

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

23. 过滤器做什么?

Filter 是 Servlet 规范组件,在容器最外层,常用于编码、CORS、XSS 过滤。

  1. 执行早于 Interceptor
  2. @WebFilter 或 FilterRegistrationBean 注册
  3. 答辩区分 Filter 与 Interceptor 顺序

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

24. 参数校验?

参数校验用 @Valid + @NotNull/@Size 等注解,BindingResult 或全局异常返回友好提示。

  1. 前端校验不可信,后端必须校验
  2. 分组校验可用于新增/编辑不同规则
  3. 答辩展示 DTO 上的注解

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

25. 分页插件?

分页限制单次查询数据量,常用 PageHelper 或 LIMIT offset,size。

  1. 前端传 pageNum/pageSize,后端封装 PageInfo
  2. 深分页 offset 过大性能差,可延迟关联优化
  3. 答辩演示列表页分页接口与 SQL

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

26. 逻辑删除?

逻辑删除用 deleted/is_deleted 标志位标记删除,查询默认带 deleted=0 条件。

  1. 数据可恢复,满足审计需求
  2. MyBatis-Plus 可用 @TableLogic 自动过滤
  3. 注意唯一索引与业务查询都要带删除条件

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

27. 自动填充?

MyBatis-Plus 自动填充 createTime/updateTime 等字段,MetaObjectHandler 在 insert/update 时赋值。

  1. 避免每个 Service 手工 set 时间
  2. @TableField(fill = FieldFill.INSERT) 标记
  3. 答辩说明审计字段如何统一维护

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

28. 乐观锁?

乐观锁用 version 字段:更新时 WHERE id=? AND version=?,成功后 version+1。

  1. 适合并发冲突较少的场景
  2. 失败则提示用户刷新重试
  3. 答辩对比悲观锁 SELECT FOR UPDATE

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

29. DTO/VO/Entity?

DTO/VO/Entity 分层:Entity 映射表,DTO 传参,VO 返前端,避免暴露密码等敏感列。

  1. Controller 接 DTO,Service 转 Entity
  2. 返回 VO 控制字段可见性
  3. 答辩体现规范分层意识

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

30. Swagger/Knife4j?

Swagger/Knife4j 自动生成接口文档,便于前后端联调与答辩展示。

  1. @ApiOperation 描述接口
  2. 生产环境常关闭或加鉴权
  3. 答辩可打开 doc.html 演示

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

31. 跨域配置?

跨域是浏览器同源策略限制不同源 AJAX 请求,需服务端 CORS 或 Nginx 反代。

  1. @CrossOrigin、WebMvcConfigurer、Filter 均可配置
  2. 允许 Origin、Methods、Headers 需最小化
  3. 前后端分离联调时高频考点

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

32. Long 精度丢失?

JavaScript Number 精度有限,Long 型 ID 序列化 JSON 可能丢失,需转 String。

  1. @JsonSerialize 或全局 Jackson 配置
  2. 前端以字符串接收大整数
  3. 答辩说明雪花 ID 场景

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

33. 文件上传限制?

文件上传通过 MultipartResolver 解析 multipart 表单,Controller 接收 MultipartFile。

  1. 限制大小、后缀白名单,防止恶意文件
  2. 存储本地目录或 OSS,数据库只存访问 URL
  3. 答辩可演示上传头像/附件的完整流程

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

34. @Async?

@Async 将方法放线程池异步执行,适合发邮件、写日志等非主路径任务。

  1. 需 @EnableAsync 与自定义 Executor
  2. 异步方法同类调用不生效
  3. 答辩说明是否使用及线程池参数

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

35. @Scheduled?

定时任务按 cron 周期执行,Spring @Scheduled 或 Quartz 管理。

  1. 如每日统计、过期数据清理
  2. 注意集群下避免重复执行(分布式锁)
  3. 答辩说明是否使用及触发时间

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

36. 线程池?

线程池复用线程、限制并发,避免无界 new Thread 导致资源耗尽。

  1. 核心/最大线程数、队列、拒绝策略
  2. Boot 可 @Bean ThreadPoolTaskExecutor
  3. 答辩结合 @Async 或定时任务说明

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

37. HikariCP?

HikariCP 是 Boot 默认高性能连接池,配置 maximum-pool-size、connection-timeout 等。

  1. 比 DBCP 更轻量
  2. 监控 active/idle 连接
  3. 答辩说明 datasource 配置段

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

38. Redis 场景?

Redis 可用于缓存热点数据、验证码、Session 共享、分布式锁等。

  1. 减轻数据库压力
  2. 注意过期策略与一致性
  3. 答辩说明项目中具体缓存了哪些数据

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

39. 消息队列?

消息队列异步解耦生产消费,削峰填谷;毕设单体可说明同步足够、MQ 为扩展方向。

  1. 生产者发消息,消费者订阅
  2. 保证可靠投递与幂等消费
  3. 答辩如实说明是否引入

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

40. 微服务?

微服务将系统拆为独立服务,独立部署扩展;本科毕设单体架构更合适,易开发答辩。

  1. 理解概念即可:注册中心、网关、熔断
  2. 说明选题规模与工期考量
  3. 可展望后期拆分

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

41. Spring Security?

Spring Security 提供认证授权过滤器链、密码加密、方法级 @PreAuthorize 等。

  1. 配置 UserDetailsService 加载用户
  2. JWT 或 Session 方案择一说明
  3. 答辩展示安全配置类

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

42. 权限注解?

权限设计常用 RBAC:用户—角色—权限,菜单与接口双重校验。

  1. 前端隐藏按钮不等于安全,后端必须鉴权
  2. 拦截器/过滤器校验登录态与角色
  3. 答辩演示管理员与普通用户差异

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

43. 越权案例?

越权:用户访问非本人资源,如改 URL 中 id 查看他人订单。

  1. 服务端校验数据归属 userId
  2. 不只隐藏前端按钮
  3. 答辩举例测试方法

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

44. 接口幂等?

幂等:同一操作多次执行结果一致,防重复提交/重复支付。

  1. 唯一索引、状态机、幂等 Token、分布式锁
  2. 前端防抖 + 后端校验双保险
  3. 答辩举例订单提交或支付场景

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

45. 导出 Excel?

Excel 导入导出常用 EasyExcel/POI,注意大数据量流式读写防 OOM。

  1. 导出列表、模板导入批量数据
  2. 校验格式与事务回滚
  3. 答辩演示导出按钮

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

46. 单元测试?

单元测试验证模块逻辑,SpringTest + JUnit/Mockito 可 Mock 依赖测 Service。

  1. 覆盖核心工具方法与关键分支
  2. 集成测试 @SpringBootTest 启动容器测接口
  3. 答辩如实说明测试范围与用例数

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

47. 集成测试?

@SpringBootTest 启动完整容器做集成测试,@WebMvcTest 只测 MVC 层。

  1. MockMvc 模拟 HTTP 请求
  2. Testcontainers 可启真实 DB
  3. 答辩说明测试覆盖范围

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

48. SpringBoot项目打包部署方式?

分为jar包和war包,毕设常用jar包。通过Maven打包生成jar包,无需额外配置Tomcat,直接通过java -jar命令启动,部署简单、运行稳定,适合服务器快速部署上线。

49. devtools?

spring-boot-devtools 开发热重启,修改类后自动 reload,生产必须移除。

  1. 仅开发依赖 scope
  2. 与 JRebel 等对比可略
  3. 答辩说明提升开发效率

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

50. Actuator?

Actuator 暴露健康检查、指标等端点,/actuator/health 用于运维探活。

  1. 生产需鉴权或关闭敏感端点
  2. 可接 Prometheus 监控
  3. 答辩了解概念即可

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

51. 枚举状态机?

枚举/constants 管理订单状态等,状态机规定合法迁移,防止非法跳转。

  1. 如 待支付→已支付→已完成
  2. 更新时校验当前状态
  3. 答辩结合业务状态字段

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

52. 统一日期格式?

日期格式需前后端统一:@JsonFormat、全局 ObjectMapper 或 yyyy-MM-dd HH:mm:ss。

  1. 避免时间戳与字符串混用导致解析失败
  2. 数据库存 datetime,接口返回格式化字符串
  3. 答辩可提及时区(GMT+8)配置

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

53. 依赖冲突?

Maven 依赖冲突用 dependency:tree 定位,exclusion 排除传递依赖或统一版本。

  1. NoClassDefFoundError 常因版本不一致
  2. Spring Boot BOM 管理版本
  3. 答辩说明 pom 调整经历

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

54. 日志脱敏?

日志用于排错、审计与性能分析,常用 SLF4J + Logback/Log4j2。

  1. 分级别:ERROR/WARN/INFO/DEBUG
  2. 关键业务、异常、慢接口应记录
  3. 生产避免打印敏感信息与过量 DEBUG

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

55. 文件安全?

文件安全:白名单后缀、限制大小、随机文件名、禁止执行权限、OSS 私有读。

  1. 防上传 webshell
  2. 下载鉴权防遍历
  3. 答辩说明上传校验代码

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

56. 慢接口排查?

慢接口排查:日志耗时、Arthas、SQL EXPLAIN、索引、N+1、缓存。

  1. 定位是 DB 还是代码逻辑
  2. 优化后对比响应时间
  3. 答辩可讲真实优化案例

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

57. 缓存穿透?

缓存穿透:查询不存在的数据,缓存与 DB 都 miss,可缓存空值或布隆过滤器。

  1. 恶意刷不存在 id
  2. 空值短 TTL 占位
  3. 答辩对比击穿/雪崩

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

58. 缓存击穿?

缓存击穿:热点 key 过期瞬间大量请求打到 DB,可用互斥锁或逻辑过期。

  1. 热点数据永不过期+异步刷新
  2. singleflight 合并查询
  3. 答辩说明高并发场景

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

59. 缓存雪崩?

缓存雪崩:大量 key 同时过期或 Redis 宕机,DB 压力骤增。

  1. 过期时间加随机抖动
  2. 集群高可用与限流降级
  3. 答辩说明缓存策略

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

60. 优雅停机?

优雅停机:收到停止信号后停止接新请求,处理完存量再退出,防数据半写入。

  1. Spring Boot 2.3+ 支持 graceful shutdown
  2. K8s preStop 钩子
  3. 答辩了解概念

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

61. 健康检查 URL?

健康检查 URL 供负载均衡/运维探测服务存活,返回 UP/DOWN 状态。

  1. Actuator /health 或自建 ping
  2. 检查 DB、Redis 等依赖
  3. 答辩说明部署后如何验证

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

62. 如何体现工程能力?

工程能力体现在:规范分层、统一异常返回、日志、测试、文档、可部署可演示。

  1. 代码注释与 README
  2. Git 提交记录
  3. 答辩强调可运行完整系统

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。

63. 最大难点?

答辩「最大难点」应讲 真实问题:现象→定位→方案→验证。

  1. 如联表同步、权限越权、分页性能、跨域联调等
  2. 体现日志、断点、SQL 优化等排错过程
  3. 避免空泛说「技术难」,要有故事线

结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。