Spring Boot 常见面试题
→ 返回 面试
Spring / Spring Boot 高频 Q&A;原理与配置细节见 Spring Boot 知识体系。
Spring 与 Spring Boot
| 问题 | 简答 | 深入 |
|---|
| Spring 和 Spring Boot 区别? | Spring 是基础 IoC/AOP 框架;Boot 约定优于配置、内嵌服务器、Starter 一键依赖 | Spring Boot基础 |
| 为什么用 Spring Boot? | 快速启动、自动配置、统一依赖版本、Actuator 运维、生态完整 | 同上 |
@SpringBootApplication 等价于? | @Configuration + @EnableAutoConfiguration + @ComponentScan | 启动流程 |
| Starter 是什么? | 依赖聚合 + 自动配置入口,如 spring-boot-starter-web | 自定义Starter |
启动与配置
| 问题 | 简答 | 深入 |
|---|
| 启动流程? | SpringApplication.run → 准备 Environment → 创建 Context → refresh → 自动配置 → 内嵌 Tomcat → Runner | 启动流程 |
| 配置优先级(高→低)? | 命令行 > 环境变量 > application-{profile}.yml > application.yml | 配置管理 |
@ConfigurationProperties vs @Value? | 前缀批量绑定、类型安全、校验;@Value 适合零散单值 | 属性绑定 |
| Profile 怎么用? | spring.profiles.active=dev;@Profile("dev") 按环境注册 Bean | 环境与Profile |
| 多环境打包? | Maven/Gradle profile 过滤 + application-{env}.yml | 同上 |
Q:ApplicationContext 和 BeanFactory?
A:BeanFactory 是基础容器;ApplicationContext 扩展了事件、国际化、AOP 等,Boot 实际用后者。
IOC / DI / Bean
| 问题 | 简答 | 深入 |
|---|
| IOC / DI? | 控制反转:对象创建交给容器;依赖注入:容器注入依赖 | IOC与DI |
| Bean 生命周期? | 实例化 → 属性注入 → Aware 回调 → 初始化(@PostConstruct/InitializingBean)→ 使用 → 销毁 | Bean生命周期 |
| Bean 作用域? | 默认 singleton;还有 prototype、request、session 等 | Bean作用域 |
@Autowired vs @Resource vs @Qualifier? | @Autowired 按类型;@Qualifier 指定名称;@Resource 按名称(JSR-250) | IOC与DI |
| 循环依赖能解决吗? | 仅单例 + 字段/setter 注入;构造器注入不行;Boot 2.6+ 默认禁止 | SpringBoot循环依赖 |
@Lazy 作用? | 延迟创建 Bean,首次使用时才初始化 | 延迟加载 |
Q:单例 Bean 线程安全吗?
A:Bean 本身默认单例,是否线程安全看 Bean 内有无共享可变状态;无状态 Service 通常安全,有状态需 prototype 或同步。
AOP
| 问题 | 简答 | 深入 |
|---|
| AOP 核心概念? | Aspect、Pointcut、Advice、Join Point;横切关注点与业务解耦 | AOP |
| Spring AOP 原理? | 运行时动态代理:有接口 JDK 代理,无接口 CGLIB 子类 | 同上 |
| JDK 代理 vs CGLIB? | JDK 基于接口;CGLIB 继承目标类,不能代理 final | 同上 |
| 五种 Advice? | Before、After、AfterReturning、AfterThrowing、Around | 同上 |
| Spring AOP vs AspectJ? | Spring 仅代理 Bean 方法;AspectJ 编译/加载期织入,能力更强 | 同上 |
Q:为什么 @Transactional 基于 AOP?
A:事务在方法前后开启/提交/回滚,是典型的环绕增强,通过代理拦截实现。
自动配置
| 问题 | 简答 | 深入 |
|---|
| 自动配置原理? | @EnableAutoConfiguration → AutoConfigurationImportSelector → 加载候选类 → @Conditional* 过滤 → 注册 Bean | 自动配置 |
| 配置清单在哪? | Boot 3:META-INF/spring/...AutoConfiguration.imports;2.x:spring.factories | 同上 |
| 如何排除自动配置? | @SpringBootApplication(exclude = XxxAutoConfiguration.class) 或 spring.autoconfigure.exclude | 同上 |
| 自定义 Starter 步骤? | xxx-spring-boot-autoconfigure + @AutoConfiguration + @ConditionalOnClass + .imports 注册 | 自定义Starter |
| 常用条件注解? | @ConditionalOnClass、OnMissingBean、OnProperty | 条件注解 |
Q:自己写的 @Configuration 和自动配置谁先谁后?
A:自动配置在 @Configuration 之后加载;@ConditionalOnMissingBean 保证用户自定义 Bean 优先。
事务
| 问题 | 简答 | 深入 |
|---|
@Transactional 原理? | AOP 代理在方法前后管理 Connection 的 commit/rollback | 事务管理 |
| 默认传播行为? | REQUIRED:有事务加入,无则新建 | 同上 |
REQUIRES_NEW vs NESTED? | NEW 挂起外层、独立提交;NESTED 嵌套保存点、内层回滚不影响外层提交 | 同上 |
| 默认回滚规则? | RuntimeException / Error 回滚;受检异常默认不回滚 | 同上 |
| 失效场景? | 同类自调用、非 public、异常被吞、错误 rollbackFor、非代理对象 | SpringBoot事务失效场景 |
Q:只读事务 @Transactional(readOnly = true) 好处?
A:提示优化(如 Hibernate 跳过脏检查);部分驱动/路由可走从库。
Web 层
| 问题 | 简答 | 深入 |
|---|
| Spring MVC 请求流程? | DispatcherServlet → HandlerMapping → Controller → 返回 ModelAndView/JSON → ViewResolver/HttpMessageConverter | MVC |
| Filter vs Interceptor vs AOP? | Filter Servlet 规范最外层;Interceptor MVC 层 Handler 前后;AOP 方法级 | 过滤器与拦截器 |
| 全局异常处理? | @RestControllerAdvice + @ExceptionHandler | 全局异常处理 |
| 参数校验? | @Valid / @Validated + JSR-303(@NotNull 等) | 参数校验 |
| REST 跨域? | @CrossOrigin 或 WebMvcConfigurer.addCorsMappings | 跨域处理 |
@Controller vs @RestController? | 后者 = @Controller + @ResponseBody,返回值直接序列化 JSON | MVC |
Q:@RequestBody 和 @RequestParam?
A:前者读请求体(JSON);后者读 query/form 参数。
数据访问
| 问题 | 简答 | 深入 |
|---|
| JPA vs MyBatis? | JPA ORM、面向对象、自动生成 SQL;MyBatis SQL 可控、复杂查询灵活 | JPA与Hibernate · MyBatis |
MyBatis #{} vs ${}? | #{} 预编译防注入;${} 字符串替换,仅用于动态表名/列名 | MyBatis |
| 连接池为什么用 HikariCP? | Boot 2+ 默认;性能好、实现精简 | 连接池配置 |
| 分页怎么做? | JPA Pageable;MyBatis-Plus Page;或 PageHelper | 分页查询 |
| 多数据源? | 多 DataSource + @DS 或 AbstractRoutingDataSource | 多数据源 |
缓存 / Redis / 消息
| 问题 | 简答 | 深入 |
|---|
| Spring Cache 怎么用? | @EnableCaching + @Cacheable / @CacheEvict / @CachePut | 缓存 |
| 缓存穿透 / 击穿 / 雪崩? | 穿透:布隆/空值;击穿:互斥锁/逻辑过期;雪崩:TTL 随机、多级缓存 | 同上 · 缓存架构 |
| Redis 集成? | spring-boot-starter-data-redis + RedisTemplate / Redisson | Redis集成 |
| 分布式锁? | Redis SET NX EX;Redisson;勿只用 SETNX 不设过期 | 分布式锁 |
| 接口幂等? | Token 一次性、唯一索引、状态机、Redis SETNX | 接口幂等性 |
安全
| 问题 | 简答 | 深入 |
|---|
| Spring Security 过滤器链? | 一系列 SecurityFilter,认证 → 授权 → 异常处理 | 安全 |
| Session vs JWT? | Session 服务端状态;JWT 无状态,适合前后端分离 | Session管理 · OAuth2与JWT |
| 密码怎么存? | BCrypt 等自适应哈希,禁止明文/可逆加密 | 密码加密 |
@PreAuthorize? | 方法级权限 SpEL 表达式 | 方法级安全 |
异步 / 定时 / 性能
| 问题 | 简答 | 深入 |
|---|
@Async 注意点? | 需 @EnableAsync;同类自调用无效(同事务);指定线程池 | 异步与线程池 |
| 定时任务? | @EnableScheduling + @Scheduled;分布式用 XXL-Job / Quartz | 定时任务 |
| 虚拟线程(JDK 21)? | spring.threads.virtual.enabled=true;提高阻塞 IO 并发 | 虚拟线程 |
| Actuator 端点? | /actuator/health、metrics;生产需鉴权与暴露控制 | Actuator监控 |
| 优雅停机? | server.shutdown=graceful + 等待进行中请求完成 | 优雅停机 |
Spring Cloud(简答)
多服务场景见 Spring Cloud 专题。
| 问题 | 简答 |
|---|
| 注册中心? | Nacos / Eureka:服务注册与发现 |
| 配置中心? | Nacos Config / Spring Cloud Config:动态配置 |
| 网关? | Spring Cloud Gateway:路由、限流、鉴权 |
| 熔断限流? | Sentinel / Resilience4j |
| 分布式事务? | Seata AT/TCC;或最终一致性(MQ) |
答题建议
- Boot 题先答「自动配置 + Starter + 内嵌容器」三板斧。
- 事务 / AOP / 异步 统一提一句「走代理,同类自调用会失效」。
- 配置题 带上优先级和 Profile。
- 结合项目:缓存怎么防击穿、接口怎么做幂等、线上怎么优雅发布。
专题笔记
相关