Spring 面试知识体系总览
本系列笔记覆盖 Spring 框架核心知识体系,从 IoC 容器到微服务,从基础用法到源码级理解,适合 Java 后端面试准备。
知识地图
十大知识模块
| # | 模块 | 核心考点 |
|---|---|---|
| # | 模块 | 核心考点 |
| :-: | ------ | --------- |
| 1 | IoC 容器 | IoC/DI、Bean 生命周期、循环依赖、三级缓存、作用域 |
| 2 | AOP 与动态代理 | JDK/CGLIB、Advice、Pointcut、@Transactional 失效 |
| 3 | 事务管理 | 传播行为、隔离级别、7种失效场景、源码级 |
| 4 | Spring MVC | DispatcherServlet 流程、参数绑定、拦截器 |
| 5 | Spring Boot | 自动配置原理、条件注解、Starter、Actuator |
| 6 | 数据访问 | JPA、N+1、关联映射、多数据源 |
| 7 | Spring Security | 认证流程、JWT、OAuth2、CSRF |
| 8 | Spring Cloud 微服务 | 注册发现、网关、配置中心、分布式事务 |
| 9 | 进阶与源码 | refresh()、@Configuration 增强、事件机制 |
| 10 | 测试与质量 | @SpringBootTest、Slice、Testcontainers |
推荐追问方向(面试官视角)
如果候选人基础扎实,建议深挖的进阶题:
IoC
"Spring 为什么要用三级缓存而不是二级?"
关键点:二级缓存可以解决循环依赖,但无法区分"完整的 Bean"和"半成品代理对象"。三级缓存存放 ObjectFactory,在 Bean 需要被提前暴露时,才决定是返回原始对象还是代理对象,实现"延迟代理创建",避免 singleton 容器中混入未包装的原始 Bean。
AOP
"同一个类里面 A 方法调用 B 方法,B 上的 @Transactional 为什么不生效?有哪些解法?"
关键点:AOP 代理机制——B 的拦截是通过代理对象调用的,而类内部 this.method() 调用的是原始对象。解法:AopContext.currentProxy()、注入自身代理、拆分为两个 Service 类。
配置
"@Configuration 加 final 会怎样?为什么?"
关键点:@Configuration 类需要被 CGLIB 增强(生成子类代理)来拦截 @Bean 方法调用,确保 singleton 作用域的 Bean 只创建一次。final 类无法被 CGLIB 继承,Full 模式降级为 Lite 模式,@Bean 方法间调用不再保证单例。
事务
"REQUIRES_NEW 在同一个事务管理器下真的会新建物理连接吗?"
关键点:默认情况下 Spring 的事务管理器使用 DataSourceTransactionManager,它从连接池获取连接。REQUIRES_NEW 会暂停当前事务、从连接池获取新连接来执行新事务,两事务使用不同物理连接。如果连接池只有一个连接,则会阻塞等待。
Spring Boot
"你自己写过 Starter 吗?spring.factories 和 AutoConfiguration.imports 有什么区别?"
关键点:spring.factories(Spring Boot 2.7 之前)和 AutoConfiguration.imports(Spring Boot 2.7+)都是自动配置的注册机制。后者是 Spring Boot 从 spring-core 的 SpringFactoriesLoader 迁移到专用文件,减少类路径扫描,提升启动速度,且文件格式更简洁——每行一个自动配置类全限定名。
JPA
"N+1 问题你怎么发现和解决?@EntityGraph 和 @Query("JOIN FETCH") 有何区别?"
关键点:N+1 在遍历关联集合时触发。发现方式:开启 spring.jpa.show-sql、配置 hibernate.count 统计。解决方式:@EntityGraph(声明式,不影响 JPQL)、JOIN FETCH(命令式,改变查询语句)、@BatchSize(懒加载批量优化)。
Security
"无状态 JWT 方案怎么处理 token 续期?怎么让 token 及时失效?"
关键点:续期方案——Refresh Token 模式(短生命周期 Access Token + 长生命周期 Refresh Token)、滑动过期。及时失效——维护黑名单(Redis + 布隆过滤器)、缩短有效期 + 刷新、版本号控制。
启动流程
"Spring Boot 和普通 Spring 启动流程的差异在哪?"
关键点:Spring Boot 在 SpringApplication.run() 中多做了:推断 Web 应用类型、加载 ApplicationContextInitializer、加载 ApplicationListener、自动装配(@EnableAutoConfiguration → 加载 AutoConfiguration.imports → 条件评估)、内嵌 Web 服务器启动。核心 refresh() 方法流程与普通 Spring 一致。
学习路线建议
- 第一阶段:IoC → AOP → 事务管理(Spring 三大基石)
- 第二阶段:Spring MVC → Spring Boot(自动配置思想)
- 第三阶段:数据访问 + Security(实际开发必备)
- 第四阶段:微服务(云原生进阶)
- 第五阶段:源码分析(走向高阶)
- 第六阶段:测试质量(工程化落地)