4. Spring Boot 答辩
本章收录 63 道老师常问问题,高频题靠前。回答时尽量结合自己的项目举例。
1. SpringBoot自动配置核心原理?
基于SPI机制+条件注解实现。项目启动时自动扫描classpath下的自动配置类,根据项目引入的依赖jar包,结合@Conditional条件注解,自动加载符合环境的默认配置,无需手动配置,实现开箱即用,开发者可通过yml配置文件自定义覆盖默认参数。
2. 项目跨域问题产生原因及三种解决方案?
- 跨域是浏览器同源策略限制,协议、域名、端口任一不同即触发跨域。解决方案:一是方法级注解@CrossOrigin
- 二是编写全局跨域配置类,统一拦截所有接口
- 三是前端代理跨域,项目采用全局配置类方式,统一规范、维护性更强。
3. MyBatis-Plus对比原生MyBatis优势?
MyBatis-Plus无侵入、零损耗,在MyBatis基础上增强功能,无需手动编写CRUD SQL,内置通用Mapper、通用Service、分页插件、条件构造器、主键生成策略,极大简化数据库操作代码,减少重复代码,开发效率翻倍。
4. 什么是 Spring Boot?核心优势?
- 约定优于配置:减少 XML,开箱即用
- 起步依赖:starter 聚合常用依赖
- 内嵌容器:jar 即可运行,部署简单
- 自动配置:按 classpath 条件装配
5. 自动配置原理是什么?
启动时加载 AutoConfiguration,结合 @Conditional* 判断是否生效;可用 spring-boot-autoconfigure 与排除项控制。
6. 一次请求经过哪些组件?
Filter → Interceptor → Controller → Service → Mapper → DB,统一异常与返回包装后回前端。
7. @SpringBootApplication注解底层组成?
- 启动注解:@SpringBootApplication
- Web注解:@RestController、@RequestMapping、@RequestBody
- 注入注解:@Autowired、@Resource
- 配置注解:@Configuration、@Bean
- 事务注解:@Transactional,分工明确,适配项目开发。
8. 如何做多环境配置?
application-dev/prod.yml + spring.profiles.active;敏感信息用环境变量,不提交仓库。
9. 事务何时失效?
事务保证一组 SQL 同成功同失败,Spring @Transactional 或数据库 BEGIN/COMMIT。
- 下单扣库存典型场景
- 隔离级别影响并发问题
- 答辩指出哪些 Service 加了事务
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
10. JWT 与 Session 如何选?
Session 在服务端保存登录态,Cookie 携带 JSESSIONID,拦截器校验是否登录。
- 登录成功写入 userId/role 等信息
- 集群需 Redis 共享 Session 或改 JWT
- 答辩能口述登录→访问受保护接口流程
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
11. MyBatis-Plus 用了哪些能力?
分页限制单次查询数据量,常用 PageHelper 或 LIMIT offset,size。
- 前端传 pageNum/pageSize,后端封装 PageInfo
- 深分页 offset 过大性能差,可延迟关联优化
- 答辩演示列表页分页接口与 SQL
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
12. SpringBoot全局异常处理怎么做的?
项目使用@RestControllerAdvice全局异常处理注解,结合@ExceptionHandler捕获全局异常,统一封装异常返回结果,避免前端展示原生报错信息,提升系统稳定性和用户体验。
13. 如何讲清登录流程?
登录流程:提交账号密码→后端校验→写 Session/签发 JWT→后续请求带凭证→拦截器鉴权。
- 密码 BCrypt 比对,不明文传输存储
- 失败次数限制与验证码可选
- 答辩建议画简单时序图
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
14. 内嵌 Tomcat?
Spring Boot 内嵌 Tomcat,jar 包即含 Web 容器,无需外置安装。
- 可换 Undertow/Jetty
- server.port 配置端口
- 答辩对比 SSM 外置 Tomcat
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
15. starter 是什么?
Starter 是 Spring Boot 起步依赖,聚合常用 jar 与自动配置。
- 如 spring-boot-starter-web 引入 MVC、Tomcat、Jackson
- 约定优于配置,减少 pom 手工维护
- 答辩可对照 pom.xml 说明引入了哪些能力
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
16. yml和properties配置文件优先级、区别?
properties优先级高于yml,相同配置下properties会覆盖yml。properties是键值对格式,层级模糊、配置繁琐;yml是树形层级配置,结构清晰、可读性强,支持对象、数组、多级嵌套配置,更适合SpringBoot项目开发。
17. @ConfigurationProperties?
@ConfigurationProperties 将配置前缀批量绑定到 Java 对象,类型安全可读。
- 比 scattered @Value 更易维护
- 配合 @EnableConfigurationProperties 注册
- 答辩可展示自定义配置类
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
18. @Value 注意?
@Value 注入单个配置项,简单场景可用;复杂结构推荐 @ConfigurationProperties。
- 占位符 ${key:default}
- SpEL 表达式支持
- 答辩说明配置文件对应关系
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
19. Bean 注入方式?
依赖注入(DI)由容器装配依赖,替代手动 new,实现解耦。
- 构造器注入更推荐:依赖明确、便于测试、避免空指针
- @Autowired/@Resource 可用于字段或 setter
- 项目中 Controller 注入 Service,Service 注入 Mapper
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
20. 循环依赖?
循环依赖指 Bean 相互注入;Spring 对单例 setter/字段注入可用三级缓存解决。
- 构造器循环依赖无法启动,应重构
- 设计时避免 Service 互相调用形成环
- 答辩强调良好分层可规避
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
21. AOP 日志?
日志用于排错、审计与性能分析,常用 SLF4J + Logback/Log4j2。
- 分级别:ERROR/WARN/INFO/DEBUG
- 关键业务、异常、慢接口应记录
- 生产避免打印敏感信息与过量 DEBUG
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
22. 拦截器做什么?
拦截器(Interceptor)在 DispatcherServlet 与 Controller 之间,可获取 Handler 做登录/权限校验。
- 比 Filter 更贴近 Spring MVC
- preHandle/postHandle/afterCompletion 三阶段
- 答辩演示未登录跳转逻辑
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
23. 过滤器做什么?
Filter 是 Servlet 规范组件,在容器最外层,常用于编码、CORS、XSS 过滤。
- 执行早于 Interceptor
- @WebFilter 或 FilterRegistrationBean 注册
- 答辩区分 Filter 与 Interceptor 顺序
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
24. 参数校验?
参数校验用 @Valid + @NotNull/@Size 等注解,BindingResult 或全局异常返回友好提示。
- 前端校验不可信,后端必须校验
- 分组校验可用于新增/编辑不同规则
- 答辩展示 DTO 上的注解
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
25. 分页插件?
分页限制单次查询数据量,常用 PageHelper 或 LIMIT offset,size。
- 前端传 pageNum/pageSize,后端封装 PageInfo
- 深分页 offset 过大性能差,可延迟关联优化
- 答辩演示列表页分页接口与 SQL
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
26. 逻辑删除?
逻辑删除用 deleted/is_deleted 标志位标记删除,查询默认带 deleted=0 条件。
- 数据可恢复,满足审计需求
- MyBatis-Plus 可用 @TableLogic 自动过滤
- 注意唯一索引与业务查询都要带删除条件
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
27. 自动填充?
MyBatis-Plus 自动填充 createTime/updateTime 等字段,MetaObjectHandler 在 insert/update 时赋值。
- 避免每个 Service 手工 set 时间
- @TableField(fill = FieldFill.INSERT) 标记
- 答辩说明审计字段如何统一维护
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
28. 乐观锁?
乐观锁用 version 字段:更新时 WHERE id=? AND version=?,成功后 version+1。
- 适合并发冲突较少的场景
- 失败则提示用户刷新重试
- 答辩对比悲观锁 SELECT FOR UPDATE
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
29. DTO/VO/Entity?
DTO/VO/Entity 分层:Entity 映射表,DTO 传参,VO 返前端,避免暴露密码等敏感列。
- Controller 接 DTO,Service 转 Entity
- 返回 VO 控制字段可见性
- 答辩体现规范分层意识
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
30. Swagger/Knife4j?
Swagger/Knife4j 自动生成接口文档,便于前后端联调与答辩展示。
- @ApiOperation 描述接口
- 生产环境常关闭或加鉴权
- 答辩可打开 doc.html 演示
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
31. 跨域配置?
跨域是浏览器同源策略限制不同源 AJAX 请求,需服务端 CORS 或 Nginx 反代。
- @CrossOrigin、WebMvcConfigurer、Filter 均可配置
- 允许 Origin、Methods、Headers 需最小化
- 前后端分离联调时高频考点
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
32. Long 精度丢失?
JavaScript Number 精度有限,Long 型 ID 序列化 JSON 可能丢失,需转 String。
- @JsonSerialize 或全局 Jackson 配置
- 前端以字符串接收大整数
- 答辩说明雪花 ID 场景
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
33. 文件上传限制?
文件上传通过 MultipartResolver 解析 multipart 表单,Controller 接收 MultipartFile。
- 限制大小、后缀白名单,防止恶意文件
- 存储本地目录或 OSS,数据库只存访问 URL
- 答辩可演示上传头像/附件的完整流程
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
34. @Async?
@Async 将方法放线程池异步执行,适合发邮件、写日志等非主路径任务。
- 需 @EnableAsync 与自定义 Executor
- 异步方法同类调用不生效
- 答辩说明是否使用及线程池参数
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
35. @Scheduled?
定时任务按 cron 周期执行,Spring @Scheduled 或 Quartz 管理。
- 如每日统计、过期数据清理
- 注意集群下避免重复执行(分布式锁)
- 答辩说明是否使用及触发时间
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
36. 线程池?
线程池复用线程、限制并发,避免无界 new Thread 导致资源耗尽。
- 核心/最大线程数、队列、拒绝策略
- Boot 可 @Bean ThreadPoolTaskExecutor
- 答辩结合 @Async 或定时任务说明
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
37. HikariCP?
HikariCP 是 Boot 默认高性能连接池,配置 maximum-pool-size、connection-timeout 等。
- 比 DBCP 更轻量
- 监控 active/idle 连接
- 答辩说明 datasource 配置段
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
38. Redis 场景?
Redis 可用于缓存热点数据、验证码、Session 共享、分布式锁等。
- 减轻数据库压力
- 注意过期策略与一致性
- 答辩说明项目中具体缓存了哪些数据
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
39. 消息队列?
消息队列异步解耦生产消费,削峰填谷;毕设单体可说明同步足够、MQ 为扩展方向。
- 生产者发消息,消费者订阅
- 保证可靠投递与幂等消费
- 答辩如实说明是否引入
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
40. 微服务?
微服务将系统拆为独立服务,独立部署扩展;本科毕设单体架构更合适,易开发答辩。
- 理解概念即可:注册中心、网关、熔断
- 说明选题规模与工期考量
- 可展望后期拆分
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
41. Spring Security?
Spring Security 提供认证授权过滤器链、密码加密、方法级 @PreAuthorize 等。
- 配置 UserDetailsService 加载用户
- JWT 或 Session 方案择一说明
- 答辩展示安全配置类
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
42. 权限注解?
权限设计常用 RBAC:用户—角色—权限,菜单与接口双重校验。
- 前端隐藏按钮不等于安全,后端必须鉴权
- 拦截器/过滤器校验登录态与角色
- 答辩演示管理员与普通用户差异
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
43. 越权案例?
越权:用户访问非本人资源,如改 URL 中 id 查看他人订单。
- 服务端校验数据归属 userId
- 不只隐藏前端按钮
- 答辩举例测试方法
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
44. 接口幂等?
幂等:同一操作多次执行结果一致,防重复提交/重复支付。
- 唯一索引、状态机、幂等 Token、分布式锁
- 前端防抖 + 后端校验双保险
- 答辩举例订单提交或支付场景
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
45. 导出 Excel?
Excel 导入导出常用 EasyExcel/POI,注意大数据量流式读写防 OOM。
- 导出列表、模板导入批量数据
- 校验格式与事务回滚
- 答辩演示导出按钮
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
46. 单元测试?
单元测试验证模块逻辑,SpringTest + JUnit/Mockito 可 Mock 依赖测 Service。
- 覆盖核心工具方法与关键分支
- 集成测试 @SpringBootTest 启动容器测接口
- 答辩如实说明测试范围与用例数
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
47. 集成测试?
@SpringBootTest 启动完整容器做集成测试,@WebMvcTest 只测 MVC 层。
- MockMvc 模拟 HTTP 请求
- Testcontainers 可启真实 DB
- 答辩说明测试覆盖范围
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
48. SpringBoot项目打包部署方式?
分为jar包和war包,毕设常用jar包。通过Maven打包生成jar包,无需额外配置Tomcat,直接通过java -jar命令启动,部署简单、运行稳定,适合服务器快速部署上线。
49. devtools?
spring-boot-devtools 开发热重启,修改类后自动 reload,生产必须移除。
- 仅开发依赖 scope
- 与 JRebel 等对比可略
- 答辩说明提升开发效率
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
50. Actuator?
Actuator 暴露健康检查、指标等端点,/actuator/health 用于运维探活。
- 生产需鉴权或关闭敏感端点
- 可接 Prometheus 监控
- 答辩了解概念即可
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
51. 枚举状态机?
枚举/constants 管理订单状态等,状态机规定合法迁移,防止非法跳转。
- 如 待支付→已支付→已完成
- 更新时校验当前状态
- 答辩结合业务状态字段
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
52. 统一日期格式?
日期格式需前后端统一:@JsonFormat、全局 ObjectMapper 或 yyyy-MM-dd HH:mm:ss。
- 避免时间戳与字符串混用导致解析失败
- 数据库存 datetime,接口返回格式化字符串
- 答辩可提及时区(GMT+8)配置
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
53. 依赖冲突?
Maven 依赖冲突用 dependency:tree 定位,exclusion 排除传递依赖或统一版本。
- NoClassDefFoundError 常因版本不一致
- Spring Boot BOM 管理版本
- 答辩说明 pom 调整经历
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
54. 日志脱敏?
日志用于排错、审计与性能分析,常用 SLF4J + Logback/Log4j2。
- 分级别:ERROR/WARN/INFO/DEBUG
- 关键业务、异常、慢接口应记录
- 生产避免打印敏感信息与过量 DEBUG
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
55. 文件安全?
文件安全:白名单后缀、限制大小、随机文件名、禁止执行权限、OSS 私有读。
- 防上传 webshell
- 下载鉴权防遍历
- 答辩说明上传校验代码
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
56. 慢接口排查?
慢接口排查:日志耗时、Arthas、SQL EXPLAIN、索引、N+1、缓存。
- 定位是 DB 还是代码逻辑
- 优化后对比响应时间
- 答辩可讲真实优化案例
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
57. 缓存穿透?
缓存穿透:查询不存在的数据,缓存与 DB 都 miss,可缓存空值或布隆过滤器。
- 恶意刷不存在 id
- 空值短 TTL 占位
- 答辩对比击穿/雪崩
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
58. 缓存击穿?
缓存击穿:热点 key 过期瞬间大量请求打到 DB,可用互斥锁或逻辑过期。
- 热点数据永不过期+异步刷新
- singleflight 合并查询
- 答辩说明高并发场景
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
59. 缓存雪崩?
缓存雪崩:大量 key 同时过期或 Redis 宕机,DB 压力骤增。
- 过期时间加随机抖动
- 集群高可用与限流降级
- 答辩说明缓存策略
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
60. 优雅停机?
优雅停机:收到停止信号后停止接新请求,处理完存量再退出,防数据半写入。
- Spring Boot 2.3+ 支持 graceful shutdown
- K8s preStop 钩子
- 答辩了解概念
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
61. 健康检查 URL?
健康检查 URL 供负载均衡/运维探测服务存活,返回 UP/DOWN 状态。
- Actuator /health 或自建 ping
- 检查 DB、Redis 等依赖
- 答辩说明部署后如何验证
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
62. 如何体现工程能力?
工程能力体现在:规范分层、统一异常返回、日志、测试、文档、可部署可演示。
- 代码注释与 README
- Git 提交记录
- 答辩强调可运行完整系统
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。
63. 最大难点?
答辩「最大难点」应讲 真实问题:现象→定位→方案→验证。
- 如联表同步、权限越权、分页性能、跨域联调等
- 体现日志、断点、SQL 优化等排错过程
- 避免空泛说「技术难」,要有故事线
结合毕设:在 Spring Boot 项目中,可指出具体类名、配置项或表结构,避免只背概念。