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:ApplicationContextBeanFactory
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:事务在方法前后开启/提交/回滚,是典型的环绕增强,通过代理拦截实现。


自动配置

问题简答深入
自动配置原理?@EnableAutoConfigurationAutoConfigurationImportSelector → 加载候选类 → @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
常用条件注解?@ConditionalOnClassOnMissingBeanOnProperty条件注解

Q:自己写的 @Configuration 和自动配置谁先谁后?
A:自动配置在 @Configuration 之后加载;@ConditionalOnMissingBean 保证用户自定义 Bean 优先。


事务

问题简答深入
@Transactional 原理?AOP 代理在方法前后管理 Connection 的 commit/rollback事务管理
默认传播行为?REQUIRED:有事务加入,无则新建同上
REQUIRES_NEW vs NESTEDNEW 挂起外层、独立提交;NESTED 嵌套保存点、内层回滚不影响外层提交同上
默认回滚规则?RuntimeException / Error 回滚;受检异常默认不回滚同上
失效场景?同类自调用、非 public、异常被吞、错误 rollbackFor、非代理对象SpringBoot事务失效场景

Q:只读事务 @Transactional(readOnly = true) 好处?
A:提示优化(如 Hibernate 跳过脏检查);部分驱动/路由可走从库。


Web 层

问题简答深入
Spring MVC 请求流程?DispatcherServlet → HandlerMapping → Controller → 返回 ModelAndView/JSON → ViewResolver/HttpMessageConverterMVC
Filter vs Interceptor vs AOP?Filter Servlet 规范最外层;Interceptor MVC 层 Handler 前后;AOP 方法级过滤器与拦截器
全局异常处理?@RestControllerAdvice + @ExceptionHandler全局异常处理
参数校验?@Valid / @Validated + JSR-303(@NotNull 等)参数校验
REST 跨域?@CrossOriginWebMvcConfigurer.addCorsMappings跨域处理
@Controller vs @RestController后者 = @Controller + @ResponseBody,返回值直接序列化 JSONMVC

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 / RedissonRedis集成
分布式锁?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/healthmetrics;生产需鉴权与暴露控制Actuator监控
优雅停机?server.shutdown=graceful + 等待进行中请求完成优雅停机

Spring Cloud(简答)

多服务场景见 Spring Cloud 专题。

问题简答
注册中心?Nacos / Eureka:服务注册与发现
配置中心?Nacos Config / Spring Cloud Config:动态配置
网关?Spring Cloud Gateway:路由、限流、鉴权
熔断限流?Sentinel / Resilience4j
分布式事务?Seata AT/TCC;或最终一致性(MQ)

答题建议

  1. Boot 题先答「自动配置 + Starter + 内嵌容器」三板斧
  2. 事务 / AOP / 异步 统一提一句「走代理,同类自调用会失效」。
  3. 配置题 带上优先级和 Profile。
  4. 结合项目:缓存怎么防击穿、接口怎么做幂等、线上怎么优雅发布。

专题笔记

相关