外观
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(可能是代理) | 循环引用时提供引用 |
| 三级 singletonFactories | ObjectFactory(工厂) | 延迟创建 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.newProxyInstance | ASM 字节码生成子类 |
| Spring Boot 默认 | 2.x 后默认 CGLIB | proxy-target-class=true |
AOP 核心概念: Aspect(切面) → Pointcut(切入点表达式) → Advice(通知: Before/After/Around) → JoinPoint(连接点)
⭐ 事务传播 + 事务失效 8 大场景
一句话: 默认 REQUIRED(有事务加入,没有新建);事务失效最常见原因是自调用(this 绕过代理)和异常被 catch 吞掉。
三个最常用传播行为:
| 传播 | 行为 | 场景 |
|---|---|---|
| REQUIRED | 有则加入,无则新建 | 默认,最常用 |
| REQUIRES_NEW | 总是新建,挂起当前 | 日志记录(主事务回滚不影响日志) |
| NESTED | 嵌套事务(savepoint) | 子任务失败只回滚到 savepoint |
事务失效 TOP4:
- 自调用(this.method() 不走代理) → 拆分到不同类或注入自身代理
- 异常被吞(catch 了没抛) → 不捕获或手动 setRollbackOnly
- 方法非 public → 只有 public 才被代理拦截
- 异常类型不对(默认只回滚 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 Image | AOT 编译为原生可执行,启动 <100ms,内存降 50-80% |
| 虚拟线程 | spring.threads.virtual.enabled=true 一行配置开启 |
| HTTP Interface | 声明式 HTTP 客户端(类似 Feign 但 Spring 原生) |
补充速览
| 关键词 | 核心答案 |
|---|---|
| IoC / DI | 控制反转 = 对象创建权交给容器;DI 是 IoC 的实现方式(@Autowired 注入) |
| Spring/Boot/Cloud | Spring = 发动机(IoC/AOP);Boot = 整车(自动配置);Cloud = 车队管理(微服务) |
| Bean 扩展点 | BeanFactoryPostProcessor(修改定义) → BeanPostProcessor(修改实例,AOP) → Aware(注入资源) |
| MyBatis 原理 | @Mapper 接口 → JDK 动态代理 → 根据方法名找 XML 中的 SQL → 执行 |
| JWT | Header.Payload.Signature;Base64 编码不是加密,Payload 任何人能看,不存敏感信息 |
| JWT vs Session | JWT 无状态/客户端存/天然分布式;Session 有状态/服务端存/需 Redis 共享 |
| RBAC | 用户 → 角色 → 权限(三表多对多),@PreAuthorize 注解鉴权 |
| WebSocket vs SSE | WebSocket 双向;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/可观测性/虚拟线程 |
✅ 自测清单
| # | 问题 | 你能说出... |
|---|---|---|
| 1 | Bean 生命周期 | 6 个里程碑 + AOP 在哪一步生成 |
| 2 | 自动装配 | 从 @EnableAutoConfiguration 到 Bean 注册的完整链路 |
| 3 | 循环依赖 | 三级缓存各存什么 + 为什么不是两级 |
| 4 | AOP 原理 | JDK 代理 vs CGLIB 区别 |
| 5 | 事务失效 | 至少说出 4 种场景 + 解决方案 |
| 6 | Boot 3.x | 三大变化 + Native Image 优劣势 |
| 7 | 拦截器 vs 过滤器 | 执行顺序 + 4 个核心区别 |
| 8 | Bean 线程安全 | "Controller 是线程安全的吗" 标准回答 |
| 7 | JWT | 三段结构 + "不是加密" |
| 8 | Spring Cloud | 组件全景图 + 各自职责 |
| 9 | Security 过滤器链 | 三层委托结构 + JWT Filter 位置 |
💡 首次全部过一遍 → 第2天只过答不上来的 → 第4天再复习 → 面试前一天最后扫一遍