Spring 面试题
目录概述
Spring 是 Java 后端绕不开的框架,但大多数候选人只停留在"会用"的层面。IOC/AOP 原理、Bean 生命周期、循环依赖、三级缓存、事务传播——每一块都能追问到 Spring 源码。
这个目录帮你从"Spring 用户"进阶到"Spring 设计者视角",理解框架底层机制。
【面试官心理】 我出 Spring 题,通常从循环依赖开始:"Spring 是怎么解决循环依赖的?三级缓存各自的作用是什么?" 能说出"三级缓存"的占 50%,能说清楚三级缓存各自作用的占 20%,能说清楚为什么需要三级而不是两级的只有 5%。这道题能精准区分"看过源码"和"没看过源码"的候选人。
内容范围
核心主题
IOC 与 DI:
- 控制反转与依赖注入:概念、目的、优势
- BeanFactory vs ApplicationContext:功能差异、启动速度
- 依赖注入方式:构造器注入、Setter 注入、字段注入
- 循环依赖:构造器循环依赖(无法解决)、Setter 循环依赖(三级缓存解决)
- 三级缓存:singletonObjects、earlySingletonObjects、singletonFactories
Bean 生命周期:
- Bean 创建过程:实例化、属性填充、初始化、销毁
- Bean 后置处理器:BeanPostProcessor、InstantiationAwareBeanPostProcessor
- 初始化方法:InitializingBean、@PostConstruct、init-method
- 销毁方法:DisposableBean、@PreDestroy、destroy-method
- Bean 作用域:singleton、prototype、request、session
AOP 原理:
- AOP 概念:切面、切入点、通知
- 静态代理 vs 动态代理:JDK 动态代理、CGLIB
- Spring AOP 实现:ProxyFactory、Advisor、Advice
- 通知类型:Before、AfterReturning、AfterThrowing、After、Around
- 代理创建时机:JDK 动态代理 vs CGLIB、proxyTargetClass
- 生效时机:代理对象方法调用时
Spring 事务:
- 编程式事务 vs 声明式事务:TransactionTemplate、@Transactional
- 事务传播行为:REQUIRED、REQUIRES_NEW、SUPPORTS、NESTED 等七种
- 事务隔离级别:与数据库隔离级别对应
- 事务失效场景:自调用、异常被 catch、传播行为不当
- 事务原理:TransactionInterceptor、TransactionAspectSupport
Spring Boot:
- 自动配置原理:@EnableAutoConfiguration、spring.factories
- 条件注解:@Conditional、@ConditionalOnClass、@ConditionalOnBean
- SPI 机制:SpringFactoriesLoader
- 启动流程:SpringApplication.run() 十二步
- 事件监听:ApplicationRunner、CommandLineRunner
Spring MVC:
- 请求处理流程:DispatcherServlet 七步
- HandlerMapping:BeanNameUrlHandlerMapping、RequestMappingHandlerMapping
- ViewResolver:InternalResourceViewResolver、ThymeleafViewResolver
- 异常处理:@ExceptionHandler、HandlerExceptionResolver
Spring 生态:
- Spring Cloud:服务治理、配置中心、负载均衡
- Spring Security:认证、授权、OAuth2
- Spring Batch:批处理框架
面试题分级
高频必考题 🔴
循环依赖与三级缓存
面试官问:"Spring 是怎么解决循环依赖的?为什么需要三级缓存?"
能说出"三级缓存"的占 50%,能说清楚各级缓存作用的占 20%,能说清楚二级缓存 earlySingletonObjects 和三级缓存 singletonFactories 各自解决什么问题的只有 10%。
【面试官心理】 我问他三级缓存,其实是在测试他有没有真正理解代理对象的创建时机。AOP 代理对象是在 Bean 初始化后创建的,但循环依赖时 Bean 还没完全创建好就需要暴露代理。怎么在不违背 Spring 设计原则的情况下解决这个问题——这才是面试官真正想听到的。
Spring 事务失效
面试官问:"@Transactional 什么时候会失效?"
能说出"自调用"的占 60%,能说出"异常被 catch"的占 40%,能说出"传播行为不当"的占 20%,能说清楚 Spring 事务是基于代理对象实现的而不是 this 调用的只有 10%。
AOP 代理原理
面试官问:"Spring AOP 是怎么实现的?JDK 动态代理和 CGLIB 有什么区别?"
能说出"JDK 代理需要实现接口、CGLIB 是子类继承"的占 80%,能说出"CGLIB 性能更好、Spring 默认选择"的占 50%,能说出"代理创建时机、proxyTargetClass 参数"的占 20%,能说清楚 Spring AOP 怎么选择代理方式的只有 10%。
Bean 生命周期
面试官问:"Spring Bean 的创建过程是什么?"
能说出"实例化、属性填充、初始化"的占 80%,能说出"后置处理器"作用的占 50%,能说出"完整十二步"的占 20%,能说清楚后置处理器在哪个环节起作用的只有 10%。
中频常考题 🟡
- ApplicationContext vs BeanFactory
- 构造器注入 vs Setter 注入
- Spring Boot 自动配置原理
- Spring MVC 请求处理流程
- Spring 事件监听机制
低频了解题 🟢
- FactoryBean 原理
- BeanDefinition 解析
- Spring 中的设计模式
- Spring WebFlux
- Spring GraphQL
学习路径指引
P5 候选人(校招/初级社招)
先掌握 IOC/AOP 基本概念、Bean 作用域、事务基础注解。能正确使用 @Service、@Repository、@Component、@Autowired。这个阶段能正确使用 Spring 即可。
P6 候选人(中级社招)
必须理解 Spring 源码。Bean 创建过程、三级缓存、循环依赖、AOP 代理机制、事务传播行为要有源码级理解。Spring Boot 自动配置、条件注解原理要清楚。
P7 候选人(高级/架构方向)
除了原理,必须有 Spring 二次开发经验。比如:自定义 Starter、实现 BeanDefinitionRegistryPostProcessor、扩展 Spring 框架。能讲清楚 Spring 框架设计思路和设计模式应用。
【面试官心理】 P7 候选人聊 Spring,我通常会问:"你们有没有对 Spring 做过二次开发?有没有扩展过 Spring 的功能?" 能讲出具体案例的,说明他对框架有深度掌握,是真正的 Spring 高手。
生产避坑
循环依赖报警
三级缓存虽然能解决 Setter 循环依赖,但如果系统里经常出现循环依赖,说明设计有问题。构造器循环依赖 Spring 无法解决,应该从代码层面避免。
事务失效
@Transactional 基于代理实现,在自调用场景下会失效。解决方案:注入自身、使用 AopContext.currentProxy()。
启动顺序问题
Spring Boot 自动配置有顺序要求,如果配置不当可能导致 Bean 注入为 null。解决方案:@Order 注解、@DependsOn 注解。