Skip to content

Spring 框架 速查卡

🎯 覆盖 22 题 | ⭐ 高频 7 题 | 预计扫描 10 分钟 📌 先看⭐一句话答案 → 展开要点 → 自测清单检验


一、IoC / Bean

知识地图:扫描注解 → BeanDefinition → 实例化 → 属性填充 → 初始化(AOP) → 使用 → 销毁

⭐ Bean 生命周期(14步精简为6个里程碑)

一句话: Bean 生命周期核心链路——实例化 → 属性填充 → Aware 回调 → 初始化三连(@PostConstruct > afterPropertiesSet > init-method)→ BeanPostProcessor 后置处理(AOP 代理在此生成) → 销毁。

实例化(new) → 属性填充(@Autowired) → Aware回调(注入容器资源)
→ BPP前置 → @PostConstruct → afterPropertiesSet → init-method
→ BPP后置 ★AOP代理在这里生成★ → 使用 → @PreDestroy → destroy

⚠️ 易错:AOP 代理在第10步 postProcessAfterInitialization 生成,不是第6步前置处理


⭐ Spring Boot 自动装配原理

一句话: @EnableAutoConfiguration → 读取 META-INF/spring.factories(3.x 改为 .imports 文件)→ 加载自动配置类 → @ConditionalOnXxx 条件过滤 → 按需生效。

@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan

                          AutoConfigurationImportSelector

                          读取 spring.factories / .imports 文件

                          @ConditionalOnClass / @ConditionalOnMissingBean 过滤

                          满足条件的配置类生效,注册 Bean

⭐ 循环依赖 + 三级缓存

一句话: Spring 通过三级缓存解决 setter 注入的循环依赖——一级存完整 Bean,二级存早期引用,三级存 ObjectFactory(延迟生成 AOP 代理)。

缓存存储内容作用
一级 singletonObjects完全初始化好的 Bean正常使用
二级 earlySingletonObjects早期暴露的 Bean(可能是代理)循环引用时提供引用
三级 singletonFactoriesObjectFactory(工厂)延迟创建 AOP 代理
创建A → 三级缓存放A工厂 → 填充属性发现需B → 创建B → B需要A
→ 三级缓存取A工厂 → 生成A早期引用(代理)放入二级 → B完成 → A完成

⚠️ 易错:"为什么三级不是两级"——三级缓存的 ObjectFactory 负责判断是否需要 AOP 代理,保证注入的是正确的代理/原始对象

↳ 无法解决:构造器注入循环依赖、prototype Bean 循环依赖


二、AOP / 事务

⭐ AOP 原理 + JDK 代理 vs CGLIB

一句话: Spring AOP 通过代理模式在方法调用前后插入横切逻辑;有接口用 JDK 动态代理(反射),无接口用 CGLIB(字节码生成子类)。

维度JDK 动态代理CGLIB
要求目标类必须有接口无(但不能代理 final 类/方法)
原理反射 + Proxy.newProxyInstanceASM 字节码生成子类
Spring Boot 默认2.x 后默认 CGLIBproxy-target-class=true

AOP 核心概念: Aspect(切面) → Pointcut(切入点表达式) → Advice(通知: Before/After/Around) → JoinPoint(连接点)


⭐ 事务传播 + 事务失效 8 大场景

一句话: 默认 REQUIRED(有事务加入,没有新建);事务失效最常见原因是自调用(this 绕过代理)异常被 catch 吞掉

三个最常用传播行为:

传播行为场景
REQUIRED有则加入,无则新建默认,最常用
REQUIRES_NEW总是新建,挂起当前日志记录(主事务回滚不影响日志)
NESTED嵌套事务(savepoint)子任务失败只回滚到 savepoint

事务失效 TOP4:

  1. 自调用(this.method() 不走代理) → 拆分到不同类或注入自身代理
  2. 异常被吞(catch 了没抛) → 不捕获或手动 setRollbackOnly
  3. 方法非 public → 只有 public 才被代理拦截
  4. 异常类型不对(默认只回滚 RuntimeException) → rollbackFor = Exception.class

⚠️ 易错:多线程中 new Thread 的操作不在同一事务(新线程 = 新数据库连接)


三、权限 / Boot 3.x

⭐ Spring Boot 3.x 三大变化

一句话: 最低 Java 17 + javax.* 全改 jakarta.*(最大迁移成本)+ GraalVM Native Image 正式支持 + 内置可观测性。

变化影响
Jakarta EE 迁移所有 javax.* → jakarta.*,第三方库也要升级
自动配置注册spring.factories → .imports 文件(更快)
Native ImageAOT 编译为原生可执行,启动 <100ms,内存降 50-80%
虚拟线程spring.threads.virtual.enabled=true 一行配置开启
HTTP Interface声明式 HTTP 客户端(类似 Feign 但 Spring 原生)

补充速览

关键词核心答案
IoC / DI控制反转 = 对象创建权交给容器;DI 是 IoC 的实现方式(@Autowired 注入)
Spring/Boot/CloudSpring = 发动机(IoC/AOP);Boot = 整车(自动配置);Cloud = 车队管理(微服务)
Bean 扩展点BeanFactoryPostProcessor(修改定义) → BeanPostProcessor(修改实例,AOP) → Aware(注入资源)
MyBatis 原理@Mapper 接口 → JDK 动态代理 → 根据方法名找 XML 中的 SQL → 执行
JWTHeader.Payload.Signature;Base64 编码不是加密,Payload 任何人能看,不存敏感信息
JWT vs SessionJWT 无状态/客户端存/天然分布式;Session 有状态/服务端存/需 Redis 共享
RBAC用户 → 角色 → 权限(三表多对多),@PreAuthorize 注解鉴权
WebSocket vs SSEWebSocket 双向;SSE 服务端单向推送(LLM流式输出用SSE)
GraalVM Native启动 <100ms + 内存降 50-80%;代价:编译慢 + 不支持运行时反射
虚拟线程集成同步代码即可高并发IO;注意 synchronized 的 pinning 问题,改用 ReentrantLock
Spring Cloud 组件Gateway(路由/限流) + Nacos(注册/配置) + Feign(声明式调用) + Sentinel(熔断) + Tracing(追踪) → 详见 12_速查_微服务架构
Security 过滤器链DelegatingFilterProxy → FilterChainProxy → SecurityFilterChain(15+内部Filter);自定义JWT Filter用addFilterBefore
⭐ 拦截器vs过滤器Filter=Servlet规范,在DispatcherServlet前,不感知Handler; Interceptor=Spring MVC,在后,能获取Handler/ModelAndView
Bean线程安全单例Bean不保证线程安全;无可变成员变量=安全(大多数Service/Controller);有状态用ThreadLocal/prototype/锁

🧠 助记汇总

口诀含义
实填感初代销Bean 生命周期:实例化/填充/感知(Aware)/初始化/代理(AOP)/销毁
一二三级缓存完整Bean / 早期引用 / 工厂(延迟AOP)
自吞非异事务失效 TOP4:自调用/吞异常/非public/异常类型不对
J改N观虚Boot 3.x:Jakarta迁移/Native Image/可观测性/虚拟线程

✅ 自测清单

#问题你能说出...
1Bean 生命周期6 个里程碑 + AOP 在哪一步生成
2自动装配从 @EnableAutoConfiguration 到 Bean 注册的完整链路
3循环依赖三级缓存各存什么 + 为什么不是两级
4AOP 原理JDK 代理 vs CGLIB 区别
5事务失效至少说出 4 种场景 + 解决方案
6Boot 3.x三大变化 + Native Image 优劣势
7拦截器 vs 过滤器执行顺序 + 4 个核心区别
8Bean 线程安全"Controller 是线程安全的吗" 标准回答
7JWT三段结构 + "不是加密"
8Spring Cloud组件全景图 + 各自职责
9Security 过滤器链三层委托结构 + JWT Filter 位置

💡 首次全部过一遍 → 第2天只过答不上来的 → 第4天再复习 → 面试前一天最后扫一遍