Spring 框架面试:IoC、AOP、事务管理、自动配置
Spring 是 Java 面试必考框架,面试官从控制反转、面向切面、事务管理、自动配置四个维度层层深入,考察原理理解、源码分析与实战经验。以下总览表+问答卡片+追问图谱,帮你一次吃透 Spring 面试核心。
📊 四大核心面试总览
| 核心概念 | 面试高频考点 | 加分回答策略 |
|---|---|---|
| IoC / DI | 控制反转的本质;依赖注入方式;Bean 生命周期;循环依赖解决 | 从「容器管理对象」切入,结合三级缓存说明循环依赖,用具体注入方式对比体现细节 |
| AOP | 代理模式原理;JDK vs CGLIB 区别;通知类型与执行顺序;切入点表达式 | 从「横切关注点」破题,对比两种代理底层机制,结合 @Order 说明顺序控制 |
| 事务管理 | 声明式事务原理;传播行为;隔离级别;事务失效场景 | 从 AOP 实现切入,重点列举 4~5 种失效场景,区分 runtime 与 checked 异常回滚差异 |
| 自动配置 | @EnableAutoConfiguration 原理;@Conditional 系列;spring.factories SPI;自定义 Starter | 从 SPI 加载路径说起,用 debug=true 查报告体现实战,给出自定义 Starter 完整步骤 |
📌 问题 1:谈谈你对 Spring IoC 的理解,它是如何实现解耦的?
🎯 面试官考察点
- 是否理解 IoC 与 DI 的关系
- 能否说出三种依赖注入方式及适用场景
- 是否了解 Bean 生命周期与容器管理
- 能否结合循环依赖说明 IoC 的深度
📋 回答框架
- 定义 IoC:控制反转 —— 将对象的创建与依赖管理交给容器
- DI 是实现方式:构造器注入、Setter 注入、字段注入
- 容器管理生命周期:实例化 → 属性赋值 → 初始化 → 使用 → 销毁
- 解耦优势:面向接口编程,对象之间不再硬编码 new,便于测试与扩展
💡 示例回答
IoC 将对象的创建权反转给 Spring 容器,DI 是其具体实现,通过构造器、Setter 或字段注入在运行时传入依赖。容器管理 Bean 完整生命周期,从实例化、属性赋值到销毁。对象之间依赖接口而非具体实现,消除了硬编码 new 的耦合,使代码更易测试、维护和扩展。例如 Service 层通过 @Autowired 注入 DAO 接口,替换实现类无需修改业务代码。
🔍 可能追问
- Bean 生命周期有哪些关键阶段?
- Spring 如何解决循环依赖?三级缓存的作用?
- @Autowired 和 @Resource 有什么区别?
📌 问题 2:Spring AOP 的实现原理是什么?JDK 动态代理和 CGLIB 代理有什么区别?
🎯 面试官考察点
- 是否理解 AOP 的底层是代理模式
- 能否清晰对比两种代理的机制与适用条件
- 是否知道 Spring Boot 默认使用哪种代理
- 能否结合通知类型说明执行顺序
📋 回答框架
- AOP 本质:基于动态代理,在运行时织入增强逻辑
- JDK 动态代理:目标类需实现接口,通过 InvocationHandler 生成代理对象
- CGLIB 代理:目标类无需接口,通过继承生成子类代理
- 选择依据:Spring Boot 2.x 默认 CGLIB;有接口时 JDK 更轻量
- 应用场景:日志、事务、权限、性能监控等横切关注点
💡 示例回答
Spring AOP 通过动态代理实现运行时织入。目标类实现接口时使用 JDK 动态代理,通过 InvocationHandler 拦截方法调用;未实现接口时使用 CGLIB 库生成子类代理,通过继承覆盖方法。JDK 代理只能代理接口方法,CGLIB 可代理普通类但不能代理 final 方法。Spring Boot 2.x 默认开启 CGLIB。AOP 将日志、事务等横切逻辑与业务代码分离,提升模块化程度。
🔍 可能追问
- @Before、@After、@Around 的执行顺序是什么?多个切面如何控制顺序?
- 切入点表达式 execution 和 @annotation 的写法与区别?
- Spring AOP 和 AspectJ 有什么区别?
📌 问题 3:Spring 事务管理是如何实现的?@Transactional 注解的工作原理是什么?
🎯 面试官考察点
- 是否理解声明式事务基于 AOP
- 能否说出事务传播行为与隔离级别的实际选择
- 是否清楚事务回滚机制(rollbackFor)
- 能否列举事务失效的常见场景
📋 回答框架
- 声明式事务:通过 @Transactional 基于 AOP 实现
- 原理:BeanPostProcessor 生成代理,方法前后添加事务逻辑
- 关键参数:propagation(传播行为)、isolation(隔离级别)、rollbackFor(回滚条件)
- 回滚机制:默认 RuntimeException 与 Error 回滚,checked 异常不回滚
- 失效场景:自调用、非 public 方法、异常被捕获、传播行为配置错误
💡 示例回答
@Transactional 通过 AOP 生成代理对象,在方法执行前开启事务、执行后提交或回滚。核心参数 propagation 控制传播行为(如 REQUIRED 加入当前事务,REQUIRES_NEW 新建独立事务),isolation 设置隔离级别(如 READ_COMMITTED),rollbackFor 指定回滚异常类型。事务失效的常见场景包括:同类中自调用导致代理失效、非 public 方法、捕获异常后未抛出、传播行为配置为 NOT_SUPPORTED 等。
🔍 可能追问
- REQUIRED 和 REQUIRES_NEW 实际如何选择?
- 嵌套事务如何用 NESTED 实现?
- 多数据源下事务如何保证一致性?
📌 问题 4:Spring Boot 自动配置的原理是什么?如何自定义一个自动配置?
🎯 面试官考察点
- 是否理解 @EnableAutoConfiguration 的工作机制
- 是否知道 spring.factories 的 SPI 加载路径
- 能否说出 @Conditional 系列注解的用途
- 是否具备自定义 Starter 的实战能力
📋 回答框架
- 入口:@SpringBootApplication 包含 @EnableAutoConfiguration
- 加载机制:通过 @Import 导入 AutoConfigurationImportSelector
- SPI 路径:读取 META-INF/spring.factories 中的自动配置类
- 条件装配:@ConditionalOnClass、@ConditionalOnBean 等控制是否生效
- 自定义步骤:定义配置类 + @Conditional 条件 + spring.factories 注册 + 命名规范 xxx-spring-boot-starter
💡 示例回答
@EnableAutoConfiguration 通过 AutoConfigurationImportSelector 加载 META-INF/spring.factories 中配置的自动配置类。每个配置类使用 @ConditionalOnClass、@ConditionalOnMissingBean 等注解按条件装配 Bean。自定义自动配置:① 编写配置类并使用 @Conditional 控制条件;② 在 resources/META-INF/spring.factories 中注册配置类全限定名;③ 遵循命名规范 xxx-spring-boot-starter。通过设置 debug=true 可查看自动配置报告。
🔍 可能追问
- @ConditionalOnClass 和 @ConditionalOnMissingBean 的作用顺序?
- 如何覆盖 Spring Boot 的自动配置?
- @ConfigurationProperties 如何绑定配置项?
🧭 Spring 面试追问分支图
从 Spring 核心出发,面试官会沿着四个方向逐步深挖。下图展示追问路径与关键知识点,帮助你在面试中提前预判下一问。