Spring IOC容器核心揭秘:BeanFactory创建、配置加载&解析并注册为BeanDefinition

文章目录

深入Spring心脏,探索IOC容器启动最关键的一步(refresh()方法:十二步精密流程中的步骤2-获取BeanFactory(obtainFreshBeanFactory()))

作为Java开发者,Spring框架早已成为我们日常开发的基石。而Spring的核心便是其强大的IOC容器 。今天,我们将深入剖析容器启动过程中最关键的一步:BeanFactory创建与配置元数据加载

一、为何这个阶段如此重要?

在Spring启动过程中,BeanFactory创建与配置加载是整个容器的基础

  • ✅ 它创建了容器的核心骨架(BeanFactory)
  • ✅ 加载并解析所有配置元数据(BeanDefinition 的资源定位过程)
  • ✅ 生成(封装)BeanDefinition(Bean的"设计蓝图")
  • ✅ 注册BeanDefinition到 IoC容器

没有这个阶段,后续的依赖注入、Bean实例化都无从谈起!

二、整体流程全景图

三、源码级深度解析

1. BeanFactory的诞生

源码入口:refresh()方法

容器创建的起点在AbstractApplicationContext.refresh()方法,其中第二步就是我们要分析的核心:

核心方法:obtainFreshBeanFactory()
核心实现:refreshBeanFactory()

AbstractRefreshableApplicationContext中实现(以XML配置为例):

BeanFactory实例化


DefaultListableBeanFactory是Spring默认的BeanFactory实现,其核心数据结构:

2. ★ 核心:加载配置元数据(从文件到内存对象)

XML配置加载入口

创建xml的解析器 XmlBeanDefinitionReader ,这里是一个委托模式

加载Bean定义


XML配置解析核心流程


这里用到了委托模式,BeanDefinitionDocumentReader委托这个类进行document的解析

Bean定义解析核心

DefaultBeanDefinitionDocumentReader中实现:

解析Bean定义的核心方法
解析默认元素

3. BeanDefinition解析:配置的"灵魂转换"

解析<bean>元素:
解析BeanDefinition
BeanDefinition关键属性:
  • beanClassName:Bean的类全限定名
  • scope:作用域(singleton/prototype等)
  • lazyInit:是否延迟初始化
  • dependsOn:依赖关系
  • constructorArgumentValues:构造参数
  • propertyValues:属性值
注册到容器

4. BeanDefinition注册:容器"花名册"

最终注册到BeanFactory的核心方法:

四、Spring的巧妙设计

1. 分层解析架构

Spring采用分层设计,每层职责清晰:

2. 资源加载抽象体系

Spring使用Resource体系抽象各种配置源:

3. 元数据解析过程优化

Spring使用元数据缓存 提高解析效率:

五、核心要点总结

  1. BeanFactory创建:
    使用DefaultListableBeanFactory作为默认实现
    支持父子容器继承
  2. 配置加载:
    支持多种配置源(XML/注解/JavaConfig)
    统一抽象为Resource体系
  3. BeanDefinition解析:
    将配置元数据转化为内存对象
    支持自定义命名空间扩展
  4. 注册机制:
    使用ConcurrentHashMap存储BeanDefinition
    维护注册顺序列表

Spring IOC容器就像一座精密的钟表,而BeanFactory的创建与配置加载就是它的主发条。只有深入理解这一核心机制,我们才能真正掌握Spring框架的精髓,编写出高效、稳定的企业级应用。


XML配置加载流程中的模式协作


关注「[一只蓝色猿]」,获取更多开发干货、技术解析和效率工具!