Spring源码阅读:XmlBeanFactory的继承结构
XmlBeanFactory 可以说是 Spring 中一个最简单的 BeanFactory,通过它可以了解 Spring 的设计思路。
BeanFactory 管理了所有 bean 实例,这些实例包括 Singleton 的、非 Singleton 的(Prototype 类型的等等)。对于 Singleton 类型的 bean,需要保证全局唯一,因此创建完之后需要保存起来,用的时候再去获取,Singleton 的管理可以交给专门的类去做。在使用 bean 的时候,有时需要使用别名来获取 bean 实例,这样更加灵活,因此还需要有专门的类负责别名的管理。
XmlBeanFactory 是 BeanFactory 的实现类,它的继承结构如下图所示
其中 BeanFactory 是最核心的管理 bean 的接口,SingletonBeanRegistry 用于管理 Singleton 类型的 bean 实例,AliasRegistry 则是提供别名管理的能力。下面从这三个接口开始,看看 XmlBeanFactory 继承结构上的接口和类的作用,以及它们都提供了哪些功能或能力。
AliasRegistry
用于管理别名:注册别名、移除别名、判断是否为别名、获取所有的别名
SimpleAliasRegistry
AliasRegistry 接口的一个简单实现,内部使用一个 map 存储别名映射关系。
1 | /** key: 别名, value: 原名 */ |
BeanDefinitionRegistry
BeanDefinition 的注册中心接口,用于管理 BeanDefinition:注册 BeanDefinition、移除 BeanDefinition、获取 BeanDefinition、判断是否包含 BeanDefinition、判断给定的 bean name 是否已使用。它继承了 AliasRegistry 接口,用于提供别名管理的能力。
SingletonBeanRegistry
SingletonBean 的注册中心接口,用于管理 SingletonBean:注册 Singleton 实例、获取 Singleton 实例、判断是否包含指定 bean name 的 Singleton 实例、获取所有 Singleton 的名字、获取所有 Singleton 的数量
DefaultSingletonBeanRegistry
它是 SingletonBeanRegistry 接口的默认实现类,提供了管理 Singleton 类型 bean 的能力,同时还继承了 SimpleAliasRegistry 类,提供别名管理的能力。
要了解 Spring 中 Singleton 是怎么注册的、getSingleton 时循环依赖的处理,可花点时间研究下 DefaultSingletonBeanRegistry 的源码实现
FactoryBeanRegistrySupport
FactoryBeanRegistrySupport 继承了 DefaultSingletonBeanRegistry,提供了管理 factoryBean 实例的能力。
1 | /** |
1 | /** |
BeanFactory
bean 工厂,至于功能,还是直接看图吧,名字都很好理解
ListableBeanFactory
继承了 BeanFactory 接口,是它的扩展,提供了枚举所有 bean 实例的功能,而不需要根据 bean 的名字一个一个地去查找。顺便说下 Listable 的含义:能列在单子上的
HierarchicalBeanFactory
继承了 BeanFactory 接口,用于表示有继承结构的 BeanFactory
ConfigurableBeanFactory
提供了配置 BeanFactory 的功能,例如 setParentBeanFactory、setBeanClassLoader、setTempClassLoader、setCacheBeanMetadata、setBeanExpressionResolver、setConversionService、addPropertyEditorRegistrar、registerCustomEditor、setTypeConverter、addEmbeddedValueResolver 等等
AutowireCapableBeanFactory
继承了 BeanFactory 接口,提供了各种 autowire 的能力
AbstractBeanFactory
BeanFactory 的抽象基类,提供了 ConfigurableBeanFactory 接口的实现,同时还继承了 FactoryBeanRegistrySupport,可用于管理 Singleton 实例。这里类方法比较多,可多花点时间研究研究
AbstractAutowireCapableBeanFactory
继承了 AbstractBeanFactory,具有了 ConfigurableBeanFactory 配置 BeanFactory 的能力,以及 DefaultSingletonBeanRegistry 管理 Singleton 的能力。它同时还实现了 AutowireCapableBeanFactory 接口,具有了处理 Autowire 的能力。同样很大,值得一看
ConfigurableListableBeanFactory
一个功能全面的 BeanFactory 接口
继承了 ListableBeanFactory 接口,提供了列出 bean 的能力
继承了 AutowireCapableBeanFactory 接口,提供了 autowire 的能力
继承了 ConfigurableBeanFactory 接口,提供了配置 BeanFactory 的能力,以及管理 Singleton 的能力,还支持继承结构的 BeanFactory
DefaultListableBeanFactory
一个成熟的 BeanFactory
实现了 BeanDefinitionRegistry 接口,提供了管理 BeanDefinition 的能力
实现了 ConfigurableListableBeanFactory 接口,提供了列出 bean、autowire、配置 BeanFactory、管理 Singleton 等能力
继承了 AbstractAutowireCapableBeanFactory
- 2020-01-14
BeanDefinitionRegistry 是一个接口,从名字上就可以看出来,它是一个管理 BeanDefinition 的注册中心。通常情况下,BeanFactory 的具体实现类也会实现该接口,用于管理 AbstractBeanDefinition 继承结构下的 BeanDefinition 实例,例如 RootBeanDefinition 和 ChildBeanDefinition 实例。
- 2020-04-11
AbstractApplicationContext
是ApplicationContext
的一个抽象实现类。和普通的BeanFactory
不同的是,ApplicationContext
可以检测到它的内部BeanFactory
中定义的特殊 Bean:自动完成BeanFactoryPostProcessor
、BeanPostProcessor
、ApplicationListener
的注册。 - 2020-03-27
Bean 的创建与获取是一个比较复杂的过程,本文主要关注 bean 获取的过程。
- 2020-01-17
前面说到 BeanDefinitionRegistry 是用来管理 BeanDefinition 的注册中心,但是还没看到 BeanDefinition 长什么样,下面就来了解下。
- 2020-03-31
当调用 BeanFactory.getBean 方法获取 Bean 时,如果 Bean 还未创建,则会触发 Bean 的创建,本文主要关注 Bean 的创建过程。