Spring 面试高频 100 题
按板块分类的 Spring 面试高频题,每题标注考察点和链接回原理笔记
一、IoC 容器(15题)
1.1 Spring IoC 和 DI 的关系?
考察点:控制反转 vs 依赖注入的概念理解
要点:IoC 是设计思想(将对象创建权反转给容器),DI 是具体实现(容器注入依赖)。IoC 是目的,DI 是手段。
→ 详阅 **IoC与DI原理**
1.2 Bean 的生命周期中,AOP 代理在哪个阶段生成?
考察点:Bean 生命周期 + AOP 代理时机
要点:postProcessAfterInitialization(BeanPostProcessor 的后置处理阶段)。在 Bean 完成初始化后、放入一级缓存之前生成代理。
→ 详阅 **Bean生命周期**
1.3 Spring 如何解决循环依赖?为什么不用二级缓存?
考察点:三级缓存机制深度理解
要点:三级缓存(singletonObjects/earlySingletonObjects/singletonFactories)解决"延迟代理创建"——三级缓存存放 ObjectFactory,只有 Bean 真的被循环依赖引用时才触发代理创建。二级缓存需要所有 Bean 实例化后就创建代理。
→ 详阅 **循环依赖与三级缓存**
1.4 构造器注入 vs 字段注入,Spring 推荐哪个?为什么?
考察点:依赖注入方式的对比
要点:构造器注入。优势:不可变性、必填依赖明确、易于单元测试。字段注入隐藏依赖、无法做 final。
→ 详阅 **IoC与DI原理**
1.5 @Lazy 注解是如何实现的?
考察点:延迟初始化原理
要点:CGLIB 生成代理对象,首次调用方法时才去容器中查找/创建目标 Bean。
→ 详阅 **循环依赖与三级缓存**
1.6 三级缓存分别存什么?各自的类型是什么?
考察点:三级缓存数据结构
要点:
- L1:
Map<String, Object>singletonObjects - L2:
Map<String, Object>earlySingletonObjects - L3:
Map<String, ObjectFactory<?>>singletonFactories
1.7 @Autowired 按什么类型注入?如果找到多个候选怎么办?
考察点:自动注入解析流程
要点:byType -> @Primary -> @Qualifier -> 抛异常
→ 详阅 **IoC与DI原理**
二、AOP 与动态代理(12题)
2.1 JDK 动态代理和 CGLIB 各自的实现原理?
考察点:两种代理机制的底层原理
要点:JDK 基于接口生成实现类(Proxy.newProxyInstance),CGLIB 基于继承生成子类(Enhancer + MethodProxy)。
→ 详阅 **JDK动态代理与CGLIB**
2.2 Spring 如何选择代理方式?能否强制使用 CGLIB?
考察点:代理策略选择
要点:有接口->JDK,无接口->CGLIB。Spring Boot 2.0+ 默认 proxyTargetClass=true 强制 CGLIB。
→ 详阅 **JDK动态代理与CGLIB**
2.3 @Transactional 标注在 private 方法上为什么不生效?
考察点:AOP 代理限制
要点:CGLIB 无法代理 private 方法(子类无法继承 private 方法),JDK 代理只代理接口方法。
→ 详阅 **@Transactional原理**
2.4 同一个类中 A 方法调用 B 方法,B 上的 AOP 注解为什么不生效?
考察点:同方法调用失效
要点:this.methodB() 调用的是原始对象,不是代理对象。解法:AopContext.currentProxy() / 自注入 / 拆分 Service。
→ 详阅 **@Transactional原理**
2.5 CGLIB 能代理 final 类吗?为什么?
考察点:CGLIB 继承机制的限制
要点:不能。CGLIB 基于继承生成子类,final 类无法被继承。
→ 详阅 **JDK动态代理与CGLIB**
三、事务管理(12题)
3.1 Spring 声明式事务的底层实现原理?
考察点:@Transactional 完整调用链
要点:AOP 代理 -> TransactionInterceptor -> invokeWithinTransaction -> PlatformTransactionManager.getTransaction -> doBegin(获取连接+关闭autoCommit) -> 业务方法 -> commit/rollback -> cleanup。
→ 详阅 **声明式事务源码分析**
3.2 TransactionSynchronizationManager 的作用?
考察点:线程绑定机制
要点:通过 ThreadLocal 维护当前线程的事务上下文(Connection、同步器、事务名称/只读/隔离级别)。
→ 详阅 **事务高级特性**
3.3 REQUIRES_NEW 在同一个事务管理器下真的会新建物理连接吗?
考察点:传播行为底层原理
要点:会。suspend() 解绑当前连接 -> doBegin() 从连接池获取新连接。如果连接池只有一个连接,会阻塞。
→ 详阅 **传播行为与隔离级别**
3.4 NESTED 传播行为底层如何实现?
考察点:嵌套事务原理
要点:JDBC 3.0 Savepoint 机制。UNSOLID 同一 Connection 上设置保存点,可以只回滚到保存点。
→ 详阅 **传播行为与隔离级别**
3.5 readOnly = true 的底层优化机制?
考察点:事务只读原理
要点:两个层面:JDBC 层(connection.setReadOnly(true)),Hibernate 层(FlushMode.MANUAL 跳过脏检查)。
→ 详阅 **事务高级特性**
四、Spring MVC(8题)
4.1 DispatcherServlet 的完整处理流程?
考察点:前端控制器模式
要点:HandlerMapping -> HandlerAdapter -> preHandle -> Controller -> postHandle -> ViewResolver -> View -> afterCompletion。
→ 详阅 **DispatcherServlet流程**
4.2 Filter 和 Interceptor 的区别?
考察点:Servlet 规范 vs Spring 框架
要点:Filter 粗粒度(Servlet 规范),Interceptor 细粒度(可访问 Handler 和 ModelAndView,可注入 Spring Bean)。
→ 详阅 **拦截器与异常处理**
4.3 @ResponseBody 底层使用什么机制将 Java 对象转为 JSON?
考察点:消息转换机制
要点:HttpMessageConverter 链,默认使用 MappingJackson2HttpMessageConverter(Jackson)。
→ 详阅 **参数绑定与返回值**
4.4 @RestControllerAdvice 的实现原理?
考察点:统一异常处理
要点:@ControllerAdvice + @ResponseBody,通过 ExceptionHandlerExceptionResolver 处理。
五、Spring Boot(8题)
5.1 @SpringBootApplication 由哪些注解组成?
考察点:组合注解理解
要点:@SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan。
→ 详阅 **自动配置原理**
5.2 自动配置的实现原理?
考察点:AutoConfiguration 加载流程
要点:@EnableAutoConfiguration -> AutoConfigurationImportSelector -> 加载 AutoConfiguration.imports -> @Conditional 评估 -> 注册 Bean。
→ 详阅 **自动配置原理**
5.3 如何编写自定义 Starter?
考察点:Starter 创建
要点:自动配置类 + @ConditionalOnClass/MissingBean + @EnableConfigurationProperties + AutoConfiguration.imports 注册。
→ 详阅 **条件注解与定制Starter**
5.4 spring.factories 和 AutoConfiguration.imports 有什么区别?
考察点:自动配置注册机制演进
要点:前者 Spring Boot 2.7 之前使用(SpringFactoriesLoader),后者 2.7+ 专用文件,启动更快。
5.5 外部化配置加载顺序?
考察点:配置优先级
要点:命令行参数 > JNDI > 系统属性 > 环境变量 > application-{profile}.yml > application.yml。
→ 详阅 **外部化配置与Actuator**
六、数据访问(8题)
6.1 N+1 问题产生的原因和解决方案?
考察点:JPA 性能优化
要点:遍历懒加载关联集合时触发。解决:@EntityGraph / JOIN FETCH / @BatchSize。
→ 详阅 **JPA高级与优化**
6.2 @EntityGraph 和 JOIN FETCH 的区别?
考察点:JPA 查询优化方式
要点:@EntityGraph 声明式不修改 JPQL,JOIN FETCH 命令式修改 JPQL。
→ 详阅 **JPA高级与优化**
6.3 @ManyToOne 的默认 fetching 策略?
考察点:关联映射默认值
要点:EAGER(注意!),建议显式设置为 LAZY。
6.4 JPA 一级缓存和二级缓存的区别?
考察点:JPA 缓存机制
要点:一级缓存 EntityManager 级别/事务内,二级缓存 SessionFactory 级别/跨事务。
七、Spring Security(8题)
7.1 Spring Security 过滤器链的结构?
考察点:安全架构
要点:DelegatingFilterProxy -> FilterChainProxy -> SecurityFilterChain(11个默认 Filter)。
→ 详阅 **认证流程与过滤器链**
7.2 认证流程中 AuthenticationManager 和 Provider 的关系?
考察点:认证架构
要点:Manager 是入口(ProviderManager),委托给多个 Provider 进行实际认证。
7.3 JWT token 如何续期?如何让 token 及时失效?
考察点:无状态认证
要点:续期用 Refresh Token 或滑动过期,失效用 Redis 黑名单、短有效期+频繁刷新、版本号。
→ 详阅 **JWT与OAuth2**
八、Spring Cloud(8题)
8.1 Nacos 和 Eureka 在 CAP 理论上的区别?
考察点:注册中心选型
要点:Nacos CP+AP 可切换,Eureka AP(已维护模式)。
→ 详阅 **服务注册发现与调用**
8.2 Spring Cloud Gateway 的工作原理?
考察点:网关路由
要点:Route(路由) + Predicate(断言) + Filter(过滤器) -> 路由到目标服务。
→ 详阅 **网关与配置中心**
8.3 Seata AT 模式和 TCC 模式的核心区别?
考察点:分布式事务
要点:AT 自动解析 SQL 生成回滚日志(UNDO_LOG),TCC 需手动实现 Try/Confirm/Cancel。
→ 详阅 **熔断降级与分布式事务**
九、进阶源码(8题)
9.1 refresh() 方法 12 步中,哪一步最关键?为什么?
考察点:IoC 容器启动源码
要点:第 11 步 finishBeanFactoryInitialization——实例化所有非懒加载 singleton Bean,Bean 生命周期全部在此完成。
→ 详阅 **refresh()启动流程**
9.2 @Configuration 类加 final 会怎样?
考察点:Full vs Lite 模式
要点:final 类无法被 CGLIB 继承,降级为 Lite 模式,@Bean 方法间调用不再保证单例。
→ 详阅 **@Configuration增强与@Import**
9.3 Spring 事件机制是同步还是异步?如何改为异步?
考察点:事件机制
要点:默认同步(SimpleApplicationEventMulticaster 同步调用),加 @Async 改为异步。
→ 详阅 **事件机制**
9.4 @Import 的三种方式?
考察点:配置导入
要点:@Import(普通类) / @Import(ImportSelector) / @Import(ImportBeanDefinitionRegistrar)。
十、测试与质量(5题)
10.1 @SpringBootTest 和切片测试的区别?
考察点:测试方式选择
要点:前者加载完整上下文(慢),后者只加载部分组件(快、专注)。
→ 详阅 **集成测试与切片测试**
10.2 @MockBean 和 @Mock 的区别?
考察点:Mock 机制
要点:@MockBean 将 Mock 注入到 ApplicationContext,@Mock 是普通 Mockito Mock。
10.3 Testcontainers 相比 H2 的优势?
考察点:测试策略
要点:SQL 100% 兼容真实数据库,能发现 H2 无法发现的方言问题。
📚 相关链接
- **面试知识体系总览** — 知识地图总览
- **Spring文库设计文档** — 文库设计总纲
- ← 返回 **面试知识体系总览**