前言
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
作为它的子类,虽然通过注入XmlBeanDefinitionReader
和ClassPathResource
,具备解析 XML 的 bean 定义生成 beanDefinition 的能力,但这超出了 bean 工厂的职责范围,所以它最后被废弃了,而是由 Spring 容器ApplicationContext
持有与 bean 配置对应的BeanDefinitionReader
完成解析和创建 beanDefinition,然后注册给DefaultListableBeanFactory
BeanFactory 架构的 UML 类图: