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:批处理框架

面试题分级

级别考察重点期望回答判分标准
P5IOC/AOP 概念、Bean 生命周期、常用注解能背出基本概念,不怵简单追问表面正确
P6源码阅读、循环依赖、事务原理能回答追问,理解底层原理深度过关
P7框架设计、Spring 生态、实战经验有框架二次开发经验,能做 trade-off经验闭环

高频必考题 🔴

循环依赖与三级缓存

面试官问:"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 注解。

导航指引