Spring 源码研究指南
一、源码下载与构建
git clone https://github.com/spring-projects/spring-framework.gitcd spring-framework./gradlew build -x test # 跳过测试,加速构建
二、核心模块结构
spring-framework/├── spring-core # 核心工具类、ASM、字节码操作├── spring-beans # BeanFactory、依赖注入├── spring-context # ApplicationContext、IOC容器├── spring-aop # 面向切面编程├── spring-web # Web支持├── spring-webmvc # SpringMVC├── spring-tx # 事务管理└── spring-jdbc # JDBC封装
三、核心研究路线
1. IOC 容器初始化
ApplicationContext 启动↓AbstractApplicationContext.refresh()↓1. prepareBeanFactory() - 配置容器2. invokeBeanFactoryPostProcessors() - 调用后置处理器3. registerBeanPostProcessors() - 注册Bean后置处理器4. initMessageSource() - 国际化5. initApplicationEventMulticaster() - 事件广播6. onRefresh() - 子类扩展7. registerListeners() - 注册监听器8. finishBeanFactoryInitialization() - 初始化所有单例Bean9. finishRefresh() - 完成刷新
2. Bean 创建流程
getBean(name)↓AbstractBeanFactory.doGetBean()↓1. 检查单例池(一级缓存)2. 检查早期引用(二级缓存)3. 检查已注册BeanDefinition(三级缓存)↓createBean()↓1. resolveBeanClass() - 解析Bean类2. resolveBeforeInstantiation() - InstantiationAwareBeanPostProcessor3. doCreateBean()├── createBeanInstance() - 实例化(构造器/工厂方法)├── populateBean() - 属性注入├── initializeBean() - 初始化│ ├── invokeAwareMethods() - Aware接口回调│ ├── applyBeanPostProcessorsBeforeInitialization() - 前置处理│ ├── invokeInitMethods() - init-method│ └── applyBeanPostProcessorsAfterInitialization() - 后置处理└── registerDisposableBean() - 注册销毁回调
3. 依赖注入(@Autowired)
populateBean()↓AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues()↓findAutowiringMetadata() - 找到所有@Autowired字段↓InjectionMetadata.InjectedElement.inject()↓ReflectionUtils.makeAccessible() + field.set(bean, value)
4. AOP 原理
@EnableAspectJAutoProxy↓AnnotationAwareAspectJAutoProxyCreator(BeanPostProcessor)↓1. 拦截所有Bean创建2. 检查切面配置(@Aspect)3. 生成代理对象(JDK动态代理 / CGLIB)4. 替换原对象放入容器
5. 事务管理
@Transactional↓TransactionInterceptor(MethodInterceptor)↓1. 获取事务管理器2.开启事务(getTransaction)3.执行目标方法4.提交/回滚(commit/reveal)
四、核心类速查
| 类名 | 职责 |
|---|---|
DefaultListableBeanFactory |
BeanFactory默认实现,Bean注册与管理 |
AbstractApplicationContext |
应用上下文基类,refresh()模板方法 |
BeanDefinitionReader |
读取Bean定义(XML/注解/配置类) |
CglibAopProxy |
CGLIB动态代理生成 |
JdkDynamicAopProxy |
JDK动态代理生成 |
AnnotationTransactionAttributeSource |
解析@Transactional |
DataSourceTransactionManager |
JDBC事务管理器 |
五、研究建议
推荐阅读顺序
1. spring-beans 源码(Bean创建、依赖注入)2. spring-context 源码(容器初始化、事件机制)3. spring-aop 源码(AOP原理、代理机制)4. spring-tx 源码(事务传播、隔离级别)5. spring-webmvc 源码(请求处理、视图解析)
调试技巧
- 在
AbstractApplicationContext.refresh()打断点,跟踪容器启动 - 在
BeanPostProcessor各方法打断点,观察Bean生命周期 - 使用
spring-instrument代理观察类加载
源码阅读工具
- IDEA Ultimate:可以直接查看Spring Framework源码并调试
- Source Insights:快速浏览代码结构
- Spring官方文档:配合理解设计思路
六、面试高频问题
- BeanFactory 和 FactoryBean 区别?
- BeanFactory:IOC容器
- FactoryBean:用于创建复杂Bean的工厂Bean(如SqlSessionFactory)
- Spring如何解决循环依赖?
- 一级缓存:成熟Bean
- 二级缓存:早期引用
- 三级缓存:BeanDefinition
- AOP代理选择逻辑?
- 有接口 → JDK动态代理
- 无接口 → CGLIB
- 强制CGLIB →
proxy-target-class="true"
- 事务传播行为?
- REQUIRED(默认):加入已有事务
- REQUIRES_NEW:新开事务
- NESTED:嵌套事务
正文完