本文目录导读:
这是一个非常经典且高区分度的面试主题,对于中高级工程师(P6+)的面试,“源码架构” 的考察往往从“会用”深入到“懂设计、能扩展、会排坑”的层面。
以下是梳理的源码架构面试核心考点,我将其分为四个维度:宏观设计、微观实现、工程哲学、以及实战扩展。
宏观设计:架构思维与模式
面试官不会问你“用了什么设计模式”,而是会问“为什么这样设计”。
-
模块划分与分层
- 考点:如何将庞大系统(如Spring、MyBatis、Netty)拆分为逻辑清晰的模块?模块间的依赖关系是怎样的?
- 必问:Spring 循环依赖(为什么三级缓存能解决,二级缓存为什么不行?)、MyBatis 的四大核心对象(SqlSession、Executor、StatementHandler、ParameterHandler)的分工。
- 高难度:Netty 的 Reactor 模型(单线程、多线程、主从多线程模型区别,以及为什么 Netty 能做到百万连接)。
-
核心设计模式的应用
- 考点:判断你是否真正理解了模式背后的权衡(Trade-off),而非死记硬背。
- 高频:
- 模板方法(Spring 的
AbstractApplicationContext.refresh()、MyBatis 的BaseExecutor)。 - 策略模式(Spring 的
Resource加载、InstantiationStrategy)。 - 工厂模式(Spring 的
BeanFactoryvsFactoryBean)。 - 责任链模式(Netty 的
ChannelPipeline、Spring MVC 的HandlerExecutionChain)。 - 观察者模式(Spring 的
ApplicationListener、ContextRefreshEvent)。
- 模板方法(Spring 的
-
“模拟实现”题
- 考点:面试官经常让你现场手写一个简化版核心逻辑。
- 例题:
- “请手写一个极简的 Spring IOC 容器(包含注解扫描、依赖注入)。”
- “请手写一个 Java 简易 HashMap(包含扩容、哈希冲突解决)。”
- “请设计一个 本地缓存(包含过期策略、LRU算法)。”
微观实现:关键流程与底层细节
这是面试中最硬核的环节,要求对核心流程的每一步都有精确理解。
-
Spring 全家桶
- IOC 核心:
BeanFactoryvsApplicationContext区别;BeanPostProcessor与BeanFactoryPostProcessor的执行时机;@Autowired的注入原理(AutowiredAnnotationBeanPostProcessor)。 - AOP 核心:JDK 动态代理 vs CGLIB 代理的选择逻辑(
DefaultAopProxyFactory);切面执行的顺序(@Order或PriorityOrdered)。 - Spring MVC:
DispatcherServlet的核心流程(HandlerMapping -> HandlerAdapter -> HandlerExceptionResolver)。 - Spring Boot:自动配置原理(
@SpringBootApplication、@EnableAutoConfiguration、spring.factories、条件注解@ConditionalOnClass等)。
- IOC 核心:
-
MyBatis
- SQL 执行流程:从
SqlSession.getMapper()-> 代理对象 ->MapperMethod->SqlCommand->Executor->StatementHandler->ResultSetHandler。 - 缓存机制:一级缓存(SqlSession级别,什么情况下会失效?)与二级缓存(
namespace级别,脏读问题?)。 - 插件原理:四大核心对象的代理链是如何生成的?(
InterceptorChain.pluginAll()+JDK Proxy)。
- SQL 执行流程:从
-
Netty(进阶高频)
- IO 模型:Selector 的
select()空转问题及其解决方案(SelectorStrategy)。 - 内存管理:内存池(
PooledByteBufAllocator)、零拷贝(CompositeByteBuf、FileRegion)、引用计数器(ReferenceCountUtil)。 - EventLoop:NioEventLoop 如何调度任务(IO 任务与非 IO 任务比例)、对
JDK NIO Bug(epoll 空轮询)的处理。
- IO 模型:Selector 的
工程哲学:高并发、可扩展与稳定性
这是从“能写代码”到“能设计系统”的分水岭。
-
并发与锁
- 考点:源码中如何优雅地处理并发?
- 经典案例:
- ConcurrentHashMap:JDK 1.7(Segment + ReentrantLock) vs JDK 1.8(Node + CAS + synchronized)的演进原因。
- ThreadPoolExecutor:
ctl参数(高3位状态 + 低29位线程数)如何用位运算保持原子性;addWorker的 CAS 逻辑。 - ReentrantLock:AQS(抽象队列同步器)的
CLH锁变体、parkAndCheckInterrupt()。
-
扩展性与 SPI
- 考点:如何让框架具有“插拔式”能力?
- 核心机制:Java SPI vs Dubbo SPI 的区别(自适应、IoC、AOP),MyBatis 的
Interceptor和 Spring 的TypeConvert都属于此范畴。
-
性能优化
- 缓存:以上提到的 MyBatis 一级/二级缓存、Spring 三级缓存。
- 池化思想:Netty 的
Recycler(对象池)比ThreadLocal的优势。 - 逻辑优化:
ConcurrentHashMap中treeifyBin何时转红黑树(链表长度 >=8 且数组长度 < 64?)。
实战与扩展
面试官喜欢“举一反三”的候选人。
-
从源码到实践
- 如何定位问题? “Spring 启动慢怎么排查?”(关注
refresh()中的onRefresh()、finishBeanFactoryInitialization()等阶段)。 - 如何优化? “如果让你给 Netty 新增一个特性,你会改哪个模块?”
- 如何定位问题? “Spring 启动慢怎么排查?”(关注
-
对比与演进
- 历史版本对比:Spring 3 vs 5(注解配置 vs XML)、JDK 8 vs 17(string switch、record、sealed class)。
- 同类技术对比:MyBatis vs Hibernate(全自动 vs 半自动,性能 vs 开发效率)。
面试官考察的核心逻辑
- 能复述(基础):知道流程,MyBatis 先解析XML再执行SQL”。
- 懂权衡(进阶):知道为什么这样设计,Spring 三级缓存是为了解决循环依赖,但又不能反过来导致代理问题”。
- 能推理(高级):能分析如果遇到Bug或性能瓶颈,如何修改源码,如果我改掉 Spring 的
@Autowired注入逻辑,如何保证线程安全?”
最后的小建议:
- 重读经典:建议重新精读 《Spring 技术内幕》 或相关 官方文档的 “Spring Framework Overview” 部分。
- 动手调试:在 IDE 中 Debug 核心流程(Spring 的
refresh()或 MyBatis 的query()),亲眼看看变量栈。 - 提问前置:可以在面试中反问面试官,您是希望我阐述整体架构,还是深入某个细节?” 这表明你具备框架思维和控制节奏的能力。
希望这份梳理对你有帮助,如果需要针对某一部分(Spring 循环依赖的细节)继续深挖,可以随时告诉我。