这是《Java开发工程师面试宝典》第4章的HTML正文片段,围绕Spring框架IoC、AOP、事务管理和自动配置四大核心,整理成了结构化面试问答卡片与可视化复习图。 ```html

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 的深度

📋 回答框架

  1. 定义 IoC:控制反转 —— 将对象的创建与依赖管理交给容器
  2. DI 是实现方式:构造器注入、Setter 注入、字段注入
  3. 容器管理生命周期:实例化 → 属性赋值 → 初始化 → 使用 → 销毁
  4. 解耦优势:面向接口编程,对象之间不再硬编码 new,便于测试与扩展

💡 示例回答

IoC 将对象的创建权反转给 Spring 容器,DI 是其具体实现,通过构造器、Setter 或字段注入在运行时传入依赖。容器管理 Bean 完整生命周期,从实例化、属性赋值到销毁。对象之间依赖接口而非具体实现,消除了硬编码 new 的耦合,使代码更易测试、维护和扩展。例如 Service 层通过 @Autowired 注入 DAO 接口,替换实现类无需修改业务代码。

🔍 可能追问

  • Bean 生命周期有哪些关键阶段?
  • Spring 如何解决循环依赖?三级缓存的作用?
  • @Autowired 和 @Resource 有什么区别?
⚠️ 避坑提醒:不要只说「IoC 是控制反转」的概念,要落到 DI 的三种方式和 Bean 生命周期上。回答循环依赖时务必说出「三级缓存」并说明每级的用途,这是区分「会用」和「懂原理」的关键。

📌 问题 2:Spring AOP 的实现原理是什么?JDK 动态代理和 CGLIB 代理有什么区别?

🎯 面试官考察点

  • 是否理解 AOP 的底层是代理模式
  • 能否清晰对比两种代理的机制与适用条件
  • 是否知道 Spring Boot 默认使用哪种代理
  • 能否结合通知类型说明执行顺序

📋 回答框架

  1. AOP 本质:基于动态代理,在运行时织入增强逻辑
  2. JDK 动态代理:目标类需实现接口,通过 InvocationHandler 生成代理对象
  3. CGLIB 代理:目标类无需接口,通过继承生成子类代理
  4. 选择依据:Spring Boot 2.x 默认 CGLIB;有接口时 JDK 更轻量
  5. 应用场景:日志、事务、权限、性能监控等横切关注点

💡 示例回答

Spring AOP 通过动态代理实现运行时织入。目标类实现接口时使用 JDK 动态代理,通过 InvocationHandler 拦截方法调用;未实现接口时使用 CGLIB 库生成子类代理,通过继承覆盖方法。JDK 代理只能代理接口方法,CGLIB 可代理普通类但不能代理 final 方法。Spring Boot 2.x 默认开启 CGLIB。AOP 将日志、事务等横切逻辑与业务代码分离,提升模块化程度。

🔍 可能追问

  • @Before、@After、@Around 的执行顺序是什么?多个切面如何控制顺序?
  • 切入点表达式 execution 和 @annotation 的写法与区别?
  • Spring AOP 和 AspectJ 有什么区别?
⚠️ 避坑提醒:不要只说「JDK 基于接口,CGLIB 基于继承」就结束。要补充「Spring Boot 默认 CGLIB」以及「CGLIB 不能代理 final 方法」。回答通知顺序时,强调 @Around 包裹 @Before / @After,多个切面用 @Order 控制。

📌 问题 3:Spring 事务管理是如何实现的?@Transactional 注解的工作原理是什么?

🎯 面试官考察点

  • 是否理解声明式事务基于 AOP
  • 能否说出事务传播行为与隔离级别的实际选择
  • 是否清楚事务回滚机制(rollbackFor)
  • 能否列举事务失效的常见场景

📋 回答框架

  1. 声明式事务:通过 @Transactional 基于 AOP 实现
  2. 原理:BeanPostProcessor 生成代理,方法前后添加事务逻辑
  3. 关键参数:propagation(传播行为)、isolation(隔离级别)、rollbackFor(回滚条件)
  4. 回滚机制:默认 RuntimeException 与 Error 回滚,checked 异常不回滚
  5. 失效场景:自调用、非 public 方法、异常被捕获、传播行为配置错误

💡 示例回答

@Transactional 通过 AOP 生成代理对象,在方法执行前开启事务、执行后提交或回滚。核心参数 propagation 控制传播行为(如 REQUIRED 加入当前事务,REQUIRES_NEW 新建独立事务),isolation 设置隔离级别(如 READ_COMMITTED),rollbackFor 指定回滚异常类型。事务失效的常见场景包括:同类中自调用导致代理失效、非 public 方法、捕获异常后未抛出、传播行为配置为 NOT_SUPPORTED 等。

🔍 可能追问

  • REQUIRED 和 REQUIRES_NEW 实际如何选择?
  • 嵌套事务如何用 NESTED 实现?
  • 多数据源下事务如何保证一致性?
⚠️ 避坑提醒:事务失效场景是高频陷阱,一定要列举 自调用、非 public、异常被 catch、传播行为不当、rollbackFor 未配置 这 5 种。同时说明自调用可通过注入自身或使用 AopContext.currentProxy() 解决。

📌 问题 4:Spring Boot 自动配置的原理是什么?如何自定义一个自动配置?

🎯 面试官考察点

  • 是否理解 @EnableAutoConfiguration 的工作机制
  • 是否知道 spring.factories 的 SPI 加载路径
  • 能否说出 @Conditional 系列注解的用途
  • 是否具备自定义 Starter 的实战能力

📋 回答框架

  1. 入口:@SpringBootApplication 包含 @EnableAutoConfiguration
  2. 加载机制:通过 @Import 导入 AutoConfigurationImportSelector
  3. SPI 路径:读取 META-INF/spring.factories 中的自动配置类
  4. 条件装配:@ConditionalOnClass、@ConditionalOnBean 等控制是否生效
  5. 自定义步骤:定义配置类 + @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.factories 具体路径 和 @Conditional 条件装配 这两个核心机制。自定义 Starter 时强调命名规范(xxx-spring-boot-starter)和自动配置报告 (debug=true) 的排错方法。

🧭 Spring 面试追问分支图

从 Spring 核心出发,面试官会沿着四个方向逐步深挖。下图展示追问路径与关键知识点,帮助你在面试中提前预判下一问。

Spring