spring 源码研究,讲讲

4次阅读
没有评论

Spring 源码研究指南

一、源码下载与构建

  1. git clone https://github.com/spring-projects/spring-framework.git
  2. cd spring-framework
  3. ./gradlew build -x test # 跳过测试,加速构建

二、核心模块结构

  1. spring-framework/
  2. ├── spring-core # 核心工具类、ASM、字节码操作
  3. ├── spring-beans # BeanFactory、依赖注入
  4. ├── spring-context # ApplicationContext、IOC容器
  5. ├── spring-aop # 面向切面编程
  6. ├── spring-web # Web支持
  7. ├── spring-webmvc # SpringMVC
  8. ├── spring-tx # 事务管理
  9. └── spring-jdbc # JDBC封装

三、核心研究路线

1. IOC 容器初始化

  1. ApplicationContext 启动
  2. AbstractApplicationContext.refresh()
  3. 1. prepareBeanFactory() - 配置容器
  4. 2. invokeBeanFactoryPostProcessors() - 调用后置处理器
  5. 3. registerBeanPostProcessors() - 注册Bean后置处理器
  6. 4. initMessageSource() - 国际化
  7. 5. initApplicationEventMulticaster() - 事件广播
  8. 6. onRefresh() - 子类扩展
  9. 7. registerListeners() - 注册监听器
  10. 8. finishBeanFactoryInitialization() - 初始化所有单例Bean
  11. 9. finishRefresh() - 完成刷新

2. Bean 创建流程

  1. getBean(name)
  2. AbstractBeanFactory.doGetBean()
  3. 1. 检查单例池(一级缓存)
  4. 2. 检查早期引用(二级缓存)
  5. 3. 检查已注册BeanDefinition(三级缓存)
  6. createBean()
  7. 1. resolveBeanClass() - 解析Bean
  8. 2. resolveBeforeInstantiation() - InstantiationAwareBeanPostProcessor
  9. 3. doCreateBean()
  10. ├── createBeanInstance() - 实例化(构造器/工厂方法)
  11. ├── populateBean() - 属性注入
  12. ├── initializeBean() - 初始化
  13. ├── invokeAwareMethods() - Aware接口回调
  14. ├── applyBeanPostProcessorsBeforeInitialization() - 前置处理
  15. ├── invokeInitMethods() - init-method
  16. └── applyBeanPostProcessorsAfterInitialization() - 后置处理
  17. └── registerDisposableBean() - 注册销毁回调

3. 依赖注入(@Autowired

  1. populateBean()
  2. AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues()
  3. findAutowiringMetadata() - 找到所有@Autowired字段
  4. InjectionMetadata.InjectedElement.inject()
  5. ReflectionUtils.makeAccessible() + field.set(bean, value)

4. AOP 原理

  1. @EnableAspectJAutoProxy
  2. AnnotationAwareAspectJAutoProxyCreatorBeanPostProcessor
  3. 1. 拦截所有Bean创建
  4. 2. 检查切面配置(@Aspect
  5. 3. 生成代理对象(JDK动态代理 / CGLIB
  6. 4. 替换原对象放入容器

5. 事务管理

  1. @Transactional
  2. TransactionInterceptorMethodInterceptor
  3. 1. 获取事务管理器
  4. 2.开启事务(getTransaction
  5. 3.执行目标方法
  6. 4.提交/回滚(commit/reveal

四、核心类速查

类名 职责
DefaultListableBeanFactory BeanFactory默认实现,Bean注册与管理
AbstractApplicationContext 应用上下文基类,refresh()模板方法
BeanDefinitionReader 读取Bean定义(XML/注解/配置类)
CglibAopProxy CGLIB动态代理生成
JdkDynamicAopProxy JDK动态代理生成
AnnotationTransactionAttributeSource 解析@Transactional
DataSourceTransactionManager JDBC事务管理器

五、研究建议

推荐阅读顺序

  1. 1. spring-beans 源码(Bean创建、依赖注入)
  2. 2. spring-context 源码(容器初始化、事件机制)
  3. 3. spring-aop 源码(AOP原理、代理机制)
  4. 4. spring-tx 源码(事务传播、隔离级别)
  5. 5. spring-webmvc 源码(请求处理、视图解析)

调试技巧

  1. 在 AbstractApplicationContext.refresh() 打断点,跟踪容器启动
  2. 在 BeanPostProcessor 各方法打断点,观察Bean生命周期
  3. 使用 spring-instrument 代理观察类加载

源码阅读工具

  • IDEA Ultimate:可以直接查看Spring Framework源码并调试
  • Source Insights:快速浏览代码结构
  • Spring官方文档:配合理解设计思路

六、面试高频问题

  1. BeanFactory 和 FactoryBean 区别?
    • BeanFactory:IOC容器
    • FactoryBean:用于创建复杂Bean的工厂Bean(如SqlSessionFactory)
  2. Spring如何解决循环依赖?
    • 一级缓存:成熟Bean
    • 二级缓存:早期引用
    • 三级缓存:BeanDefinition
  3. AOP代理选择逻辑?
    • 有接口 → JDK动态代理
    • 无接口 → CGLIB
    • 强制CGLIB → proxy-target-class="true"
  4. 事务传播行为?
    • REQUIRED(默认):加入已有事务
    • REQUIRES_NEW:新开事务
    • NESTED:嵌套事务
正文完
 0
bdspAdmin
版权声明:本站原创文章,由 bdspAdmin 于2026-04-27发表,共计2685字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)