Spring 面试指南:核心详解(2025 年最新版)
基于 2025 年大厂面试趋势(如阿里、腾讯、字节等),本指南聚焦 Spring 框架的核心概念,提供详尽解释、原理剖析、代码示例及常见坑点。内容来源于最新在线资源(如 JavaGuide、腾讯云开发者社区、JavaBetter 等),确保时效性。指南分为 基础篇、IoC 篇、Bean 管理篇、AOP 篇、事务篇、Spring Boot 篇 等模块,便于系统复习。
如果你是初级到高级开发者,建议先掌握基础,再深入源码和高级题。每个模块后附面试应对技巧。总计覆盖 50+ 高频题,带详解 + 源码点拨。
一、基础篇
Spring 框架的核心是 IoC(控制反转) 和 AOP(面向切面编程),旨在降低耦合、提升可维护性。2025 年面试强调源码理解和实际应用,如循环依赖解决、事务失效场景。
| 问题 | 详解 & 答案 |
|---|---|
| 什么是 Spring 框架? | Spring 是一个开源、轻量级 Java EE 开发框架,提供全面基础设施,支持 IoC、DI、AOP 等。核心目标:简化企业级开发,不重新造轮子。优点:模块化、非侵入式、生态丰富(Spring Boot、Cloud)。缺点:学习曲线陡峭,配置复杂(Boot 已优化)。2025 年新特性:Spring 6 支持 Java 17+、Jakarta EE 迁移。 |
| Spring 模块有哪些? | – Core Container:IoC/DI 基础(spring-core、beans、context)。 – AOP:面向切面(spring-aop)。 – Data Access:JDBC/ORM/事务(spring-jdbc、tx、orm)。 – Web:MVC/WebFlux(spring-webmvc、webflux)。 – Test/Messaging:测试/消息。2025 年焦点:WebFlux 响应式编程。 |
| Spring、Spring MVC、Spring Boot 关系? | Spring 是基础框架;Spring MVC 是其 Web 模块(MVC 模式);Spring Boot 是简化版脚手架(自动配置、内嵌容器)。Boot 内置 MVC,但更注重微服务。示例:Boot 通过 Starter 简化 MVC 配置。 |
| Spring 用到哪些设计模式? | – 工厂:BeanFactory 创建 Bean。 – 单例:默认 Bean 作用域。 – 代理:AOP 动态代理。 – 模板方法:JdbcTemplate。 – 观察者:事件机制。 – 适配器:HandlerAdapter。 至少说 5-7 种,结合源码举例加分。 |
面试技巧:强调 Spring 的“开箱即用”,结合项目谈如何用 Boot 加速开发。
二、IoC 篇
IoC 是 Spring 灵魂:将对象控制权交给容器,解决耦合。核心类:ApplicationContext、BeanFactory。
| 问题 | 详解 & 答案 |
|---|---|
| IoC 是什么?解决了什么? | IoC(Inversion of Control)是设计思想,容器管理对象创建/生命周期/依赖。问题解决:降低模块耦合,便于测试/扩展。DI(Dependency Injection)是其实现手段(如 @Autowired)。 |
| IoC 实现机制? | 1. 加载 BeanDefinition(注解/XML)。2. 创建 BeanFactory。3. 实例化(反射)。4. 属性注入(Autowired)。5. 初始化(PostConstruct)。核心:refresh() 方法的 12 步流程。 |
| 依赖注入方式? | – 构造函数:推荐(不可变、初始化保证)。 – Setter:可选依赖。 – 字段:简单,但不利于测试。优先构造函数,2025 年面试常问为什么不推荐字段注入。 |
| @Autowired vs @Resource? | @Autowired(Spring):byType,默认 required=true。 @Resource(JDK):byName,支持 fallback to byType。@Autowired 更灵活,但需 @Qualifier 解决多实现。 |
| 自动装配原理? | AutowiredAnnotationBeanPostProcessor 扫描注入点 → findAutowiringMetadata → 反射注入。支持 byType/byName,支持 @Primary/@Qualifier 优先级。 |
面试技巧:画 IoC 流程图,提到三级缓存预备循环依赖题。
三、Bean 管理篇
Bean 是容器管理的对象,默认单例。生命周期是面试重灾区。
| 问题 | 详解 & 答案 |
|---|---|
| Bean 声明注解? | @Component(通用)、@Service(服务)、@Repository(DAO)、@Controller(控制器)。扫描路径由 @ComponentScan 控制。 |
| @Component vs @Bean? | @Component:类级,自动扫描。 @Bean:方法级,手动定义(适合第三方类)。@Bean 更灵活,支持逻辑。 |
| Bean 生命周期? | 5 阶段:实例化 → 属性赋值 → 初始化(Aware → PostConstruct → InitializingBean → init-method) → 使用 → 销毁(PreDestroy → DisposableBean → destroy-method)。扩展点:BeanPostProcessor。 |
| Bean 作用域? | singleton(默认,全局唯一)、prototype(每次新实例)、request/session/application(Web)。singleton 需注意线程安全。 |
| Bean 线程安全? | 默认不安全(singleton 有状态变量)。解决:无状态设计、ThreadLocal、同步锁、prototype 作用域。 |
| 循环依赖怎么解决? | 三级缓存:singletonObjects(成品)、earlySingletonObjects(早期暴露)、singletonFactories(工厂,解决 AOP 代理)。过程:A 创建 → 放三级 → 注入 B → B 创建 → 放三级 → 注入 A(从三级 getEarlyBean) → 升级缓存。构造函数循环无法解决,用 @Lazy。 |
面试技巧:手画三级缓存流程图,解释为什么不用二级(AOP 代理问题)。
四、AOP 篇
AOP 处理横切逻辑,基于代理(JDK/CGLIB)。
| 问题 | 详解 & 答案 |
|---|---|
| AOP 是什么? | 面向切面编程,将日志/事务等从业务分离。核心:Aspect(切面)、Pointcut(切点)、Advice(通知)。 |
| Spring AOP vs AspectJ? | Spring AOP:运行时代理,仅方法级。 AspectJ:编译时,功能强(字段级)。Spring 集成 AspectJ 注解。 |
| 通知类型? | Before、After、AfterReturning、AfterThrowing、Around。Around 最强大,可控制执行。 |
| AOP 执行顺序? | 用 @Order 或 Ordered 接口控制,值小优先。多个切面:外层 Around Before → 内层 → 异常/返回 → After。 |
面试技巧:举日志 AOP 示例,谈代理选择(接口用 JDK,无接口用 CGLIB)。
五、事务篇
事务确保一致性,声明式更常见。
| 问题 | 详解 & 答案 |
|---|---|
| 事务管理方式? | 编程式(TransactionTemplate);声明式(@Transactional,AOP 实现)。 |
| 传播行为? | 7 种:REQUIRED(默认,加入或新建)、REQUIRES_NEW(新事务)、NESTED(嵌套,Savepoint)。NESTED vs REQUIRES_NEW:前者回滚不影响外层。 |
| 隔离级别? | DEFAULT(数据库默认)、READ_UNCOMMITTED(脏读)、READ_COMMITTED(不可重复读)、REPEATABLE_READ(幻读)、SERIALIZABLE(串行)。MySQL 默认 REPEATABLE_READ。 |
| @Transactional 失效场景? | 非 public 方法、自调用(无代理)、checked 异常不回滚、try-catch 吃异常、数据库不支持、多线程。解决:用 AopContext.currentProxy() 或 rollbackFor=Exception.class。 |
| 事务底层原理? | AOP + TransactionInterceptor → ThreadLocal 存 ConnectionHolder → commit/rollback。 |
面试技巧:列 5+ 失效场景,谈分布式事务(Seata)。
六、Spring Boot 篇
Boot 是 Spring 的“快速启动器”,2025 年焦点:Native Image、WebFlux。
| 问题 | 详解 & 答案 |
|---|---|
| Boot 启动原理? | SpringApplication.run():创建上下文 → 准备 Environment → refresh()(自动装配) → 启动容器。@SpringBootApplication = Configuration + EnableAutoConfiguration + ComponentScan。 |
| 自动装配原理? | @EnableAutoConfiguration → AutoConfigurationImportSelector → 读 spring.factories(Boot 3+ 用 imports 文件) → @Conditional 判断加载。 |
| Starter 机制? | Starter 提供依赖套餐 + 自动配置类(@Configuration + @Conditional)。自定义:建 autoconfigure 模块 + spring.factories。 |
| Boot 3 vs 2 区别? | Java 17+、Jakarta EE(javax → jakarta)、GraalVM Native 支持、AOT 编译。 |
面试技巧:谈如何自定义 Starter,强调 Boot 的生产就绪(如 Actuator)。
七、高级 & 扩展篇
- 事件机制:ApplicationEvent + Listener,观察者模式。
- 缓存:@Cacheable/@CacheEvict,底层 AOP + CacheManager(可接 Redis)。
- Spring Cloud:微服务套件(Nacos、Gateway、Sentinel)。
- 测试:@SpringBootTest + MockMvc。
终极建议:背 20+ 核心题,练手绘图(生命周期、三级缓存)。项目中多用 Boot + Cloud。需源码解析?指定题号我细拆!