当前位置: 首页 > article >正文

Spring 源码硬核解析系列专题(二):Bean 的创建与循环依赖揭秘

在上一期中,我们详细解析了 IoC 容器的初始化过程,了解了 Spring 如何通过 refresh() 方法加载配置并准备好 BeanFactory。但 Spring 的魔法并不止于此——真正的核心在于如何通过 getBean() 方法将 BeanDefinition 转化为活生生的对象实例。本篇将带你走进 Bean 的创建流程,并解开循环依赖这一经典问题的神秘面纱。

1. 从 getBean() 开始

无论是手动调用 context.getBean("myBean"),还是容器自动注入依赖,getBean() 都是 Spring 创建 Bean 的入口。它的核心实现在 AbstractBeanFactory 类中,代码如下(精简版):

public Object getBean(String name) throws BeansException {
   
    return doGetBean(name, null, null, false);
}

真正的逻辑在 doGetBean() 方法中,这个方法长达数百行,涵盖了 Bean 创建的方方面面。让我们逐步拆解。

2. Bean 创建的完整流程

假设我们请求一个简单的单例 Bean(如 <bean id="myBean" class="com.example.MyBean"/>),doGetBean() 的执行流程如下:

2.1 检查缓存

Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null) {
   
    return sharedInstance;
}
  • Spring 首先检查一级缓存(singletonObjects),如果 Bean 已创建,直接返回。
  • 单例 Bean 的缓存机制是性能优化的关键。

2.2 获取 BeanDefinition

RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
  • BeanFactory 中获取合并后的 BeanDefinition,包含类的元信息。

2.3 检查依赖


http://www.kler.cn/a/559424.html

相关文章:

  • vLLM学习1
  • nvidia-docker2 和 NVIDIA Container Toolkit 的区别及推荐
  • 极客大学 java 进阶训练营怎么样,图文详解
  • SQL LCASE() 函数详解
  • 【机器学习】信息熵 交叉熵和相对熵
  • 爬虫小案例csv写入
  • FreeRTOS-rust 编译分析
  • 从CNN到 Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类
  • 深入理解TypeScript中的never类型
  • Caffeine:高性能的Java本地缓存库
  • 【Web开发】PythonAnyWhere免费部署Django项目
  • 解放大脑!用DeepSeek自动生成PPT!
  • Steam回退游戏版本
  • uniapp邪门事件
  • HTML之JavaScript DOM操作元素(1)
  • react路由总结
  • 2025保险与金融领域实战全解析:DeepSeek赋能细分领域深度指南(附全流程案例)
  • 波兰发布世界首个双足肌肉骨骼机器人,细节高度模拟人类生物特征
  • Jenkins 创建 Node 到 Windows
  • Qt 中集成mqtt协议