框架与中间件

面试官翻到简历上"熟悉 Spring"这一行,眉头一皱,问了一句:

"Spring 的 Bean 生命周期说一下。"

候选人小张开始背:"实例化 → 属性填充 → 初始化 → 销毁……"背到一半卡住了。面试官追问:"那 BeanPostProcessor 是什么时候执行的?跟 InitializingBean 是什么关系?"

小张彻底歇菜。

这种场景我见过太多次了。框架是 Java 后端面试的重灾区——太多人停留在"会用"的层面,一追问源码就原形毕露。

今天这个模块,带你从源码层面把主流框架全部过一遍。

一、内容版图

1.1 Spring 生态

目录覆盖内容
springIoC 容器、Bean 生命周期、循环依赖、AOP 原理
springboot自动装配原理、-starter 机制、内嵌容器
springcloud注册中心(Nacos/Eureka)、服务调用(Feign/OpenFeign)、熔断器(Sentinel/Hystrix)、网关(Gateway)
otherSpring Security、Spring Validation

1.2 数据层框架

目录覆盖内容
mybatis整体架构、Executor 执行器、插件机制、二级缓存
searchElasticsearch 倒排索引、Query DSL、搜索优化

1.3 中间件

目录覆盖内容
mqKafka/RocketMQ/RabbitMQ 的选型对比、消费模式、消息可靠性、顺序消息
rpcRPC 原理、Dubbo 架构、服务注册与发现、负载均衡

二、面试核心:为什么总问框架

因为框架是 Java 后端开发的基本功,但大部分候选人的理解只停留在配置和注解层面。

我面试过这么多人,发现一个规律:

  • 会用 Spring:能写 @Service@Autowired,能配置个 XML
  • 懂 Spring:能说清 IoC、AOP 的实现原理,知道 BeanPostProcessor 的作用
  • 精通 Spring:能讲清楚循环依赖怎么解决、自动装配的优先级、Spring Boot 的 starter 怎么写

这三个层次,在面试中的差距是致命的。

【面试官心理】

我问他 Spring 原理,不是想听他背书。我想知道的是:他在项目中遇到过什么问题,怎么解决的,是只在表面修修补补,还是真的往底层看过。

框架面试的核心,不是考你记住了多少 API,而是考你有没有"透过框架看本质"的习惯。

三、高频面试题地图

3.1 Spring 必考点 🔴

第一层:Bean 生命周期
  → Spring 容器怎么管理 Bean 的创建、使用、销毁

第二层:循环依赖
  → 三级缓存是什么?为什么需要三级而不是两级?
  → 构造器注入能解决循环依赖吗?

第三层:AOP 原理
  → JDK 动态代理 vs CGLIB 的区别
  → 为什么 Spring 默认选择 CGLIB?
  → 失效场景:内部方法调用

第四层:事务
  → 事务传播行为:REQUIRED、REQUIRES_NEW……
  → 失效场景:同一个类内部调用

3.2 Spring Boot 必考点 🔴

第一层:自动装配
  → @SpringBootApplication 拆解:@EnableAutoConfiguration
  → META-INF/spring.factories vs spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

第二层:starter 机制
  → 怎么写一个自定义 starter?
  → 自动配置的底层:@Conditional 系列注解

第三层:内嵌容器
  → Tomcat 是怎么被内嵌进来的?
  → Spring Boot 的启动流程

3.3 MyBatis 必考点 🟡

第一层:整体架构
  → SqlSession → Executor → StatementHandler → ResultSetHandler

第二层:插件机制
  → 插件的原理是什么?InterceptorChain 是怎么工作的?

第三层:缓存
  → 一级缓存和二级缓存的区别
  → 为什么说二级缓存容易出生产问题?

3.4 消息队列必考点 🟡

第一层:选型对比
  → Kafka vs RocketMQ vs RabbitMQ 的取舍

第二层:消息可靠性
  → 怎么保证消息不丢失?生产者端、Broker 端、消费者端

第三层:顺序消息
  → 怎么保证消息的顺序性?

第四层:幂等性
  → 消费者端怎么做到幂等?

3.5 RPC 必考点 🟡

第一层:RPC 原理
  → 远程调用是怎么实现的?序列化、反序列化、协议栈

第二层:Dubbo 架构
  → Provider、Consumer、Registry、Monitor 的关系
  → 服务注册与发现的过程

第三层:负载均衡
  → 几种负载均衡策略:Random、RoundRobin、LeastActive、ConsistentHash

四、学习方法

4.1 从"能用"到"真懂"

每个框架,都问自己三个问题:

  1. 它解决了什么问题? —— 找到设计的核心动机
  2. 它是怎么实现的? —— 看源码,理解关键流程
  3. 它在什么场景下会出问题? —— 生产踩过的坑,才是真正的高分答案

4.2 源码怎么看

源码不是从头看到尾,是带着问题去看。

比如看 Spring Bean 生命周期,不要先翻完所有源码,而是先问清楚"循环依赖"这个问题,然后顺着这个问题去源码里找答案。

框架面试中,会问问题比会背答案重要得多

4.3 生产案例怎么准备

每个知识点,尽量准备一个生产案例。可以是你踩过的坑,也可以是你看到别人踩的坑。

"线上有个接口超时,排查发现是 MyBatis 二级缓存没关闭,导致脏数据"——这种回答比背十遍缓存原理都管用。

【面试官心理】

面试官最想听到的,不是"我会用 XX 框架",而是"我用过 XX 框架,踩过 XX 坑,是这么排查和解决的"。框架只是工具,真正考察的是你解决问题的能力。

五、导航指引

💡

框架面试的进阶路径:先搞懂核心原理(IoC/AOP/自动装配),再准备生产踩坑案例,最后能用对比的视角选型。做到这三点,P6 到 P7 的跨越就不远了。