dcddc

西米大人的博客

0%

系统学习Spring源码-BeanFactory架构

前言

Spring 目前使用的 bean 工厂是DefaultListableBeanFactory,围绕该工厂的类图架构,可以窥探 Spring 是如何一步步勾勒出这个功能齐全的 bean 工厂

BeanFactory 架构

基础类

BeanFactory

  • bean 工厂的顶层接口,就是一个简单工厂,提供获取 bean 实例的工厂方法 getBean

ConfigurableBeanFactory

  • 扩展BeanFactory
  • 可配置的 bean 工厂,bean 工厂的扩展能力在此基础上构建
  • 在 BeanFactory 的基础上增加了一些配置 bean 工厂的方法,例如为 bean 工厂添加属性编辑注册器 PropertyEditorRegistrar、设置 BeanClassLoader、添加 bpp
    • 可配置的 bean 工厂体现在对 bean 加载过程的定制化

AutowireCapableBeanFactory

  • 扩展BeanFactory
  • 该工厂专注于创建支持依赖注入的 bean 实例
    • 定义了实际加载得到 bean 实例的 createBean 接口,返回已完成依赖注入和初始化的 bean 实例
    • 定义了对实例化的 bean 实现依赖注入的接口
    • 定义了 bean 初始化相关接口

DefaultSingletonBeanRegistry

  • 单例 bean 注册中心,保证单例 bean 在创建中和创建后的全局唯一性
  • 内部维护一些 map 缓存,在单例 bean 创建中和创建后管理单例 bean

FactoryBeanRegistrySupport

  • 扩展DefaultSingletonBeanRegistry
  • 支持拿到 factoryBean 或通过 factoryBean 获取 realBean

BeanDefinitionRegistry

  • beanDefinition 注册中心
  • 提供 BeanDefinition 的注册和查询接口,bean 工厂实现该接口就会基于 beanDefinition 加载 bean

核心类

AbstractBeanFactory

  • 可配置的基础 bean 工厂
    • 实现了BeanFactory的工厂方法 getBean,框定了除真正加载 bean 之外的流程
      • 包括 bean 加载前的优先查三级缓存逻辑、factoryBean 加载 realBean 逻辑、循环依赖检测、加载 depends-on beans
      • 包括 bean 加载后的操作,存入单例缓存 map
    • 实现了ConfigurableBeanFactory,是一个可配置的 bean 工厂
      • 可注册 bpp、PropertyEditorRegistrar、StringValueResolver
    • 继承FactoryBeanRegistrySupport,可拿到 factoryBean 或通过 factoryBean 获取 realBean
    • 提供模板方法 createBean,由子类真正去加载得到 bean 实例

AbstractAutowireCapableBeanFactory

  • 可配置、具备依赖注入能力的 bean 工厂,实现核心的 bean 加载流程
    • 继承AbstractBeanFactory,可拿到所有对 bean 工厂的自定义配置。实现 createBean 方法,加载得到 bean 实例
  • 实现AutowireCapableBeanFactory,可在 bean 加载过程中对 bean 实例做依赖注入和初始化,以及基于 bean 工厂的配置来定制 bean 加载流程

DefaultListableBeanFactory

  • 可配置、具备依赖注入能力、可枚举、可注册 beanDefinition 的 bean 工厂
    • 实现ListableBeanFactory,提供 byName、byType、byAnnotation 等多种方式枚举 bean 实例、beanNames 的能力
    • 实现BeanDefinitionRegistry,提供对 beanDefinition 注册、枚举的能力
    • 继承AbstractAutowireCapableBeanFactory,本身是一个可配置、具备依赖注入能力的 bean 工厂

总结

DefaultListableBeanFactory是 Spring 默认使用的 bean 工厂,它是 beanDefinition 和 bean 的容器,提供 byName、byType、byAnnotation 等多种方式枚举 bean 实例、beanNames、beanDefinition 的能力。同时具备 bean 工厂的基础能力,可以基于注册的 beanDefinition 加载 bean,支持加载过程中的依赖自动注入。并提供对于 bean 工厂的扩展能力,可以向 bean 工厂注册自定义的 bpp、PropertyEditorRegistrar 等,来定制和影响 bean 加载流程

DefaultListableBeanFactory不负责解析 bean 配置生成 beanDefinition。XmlBeanFactory作为它的子类,虽然通过注入XmlBeanDefinitionReaderClassPathResource,具备解析 XML 的 bean 定义生成 beanDefinition 的能力,但这超出了 bean 工厂的职责范围,所以它最后被废弃了,而是由 Spring 容器ApplicationContext持有与 bean 配置对应的BeanDefinitionReader完成解析和创建 beanDefinition,然后注册给DefaultListableBeanFactory

BeanFactory 架构的 UML 类图: