一.前言
在第一篇的时候我们就讲过, spring ioc 的实现,主要的有两条实现分支,而 DefaultListableBeanFactory 的实现就是我们的第一个 BeanFactory 主要实现分支.
来看一下 DefaultListableBeanFactory 的类结构:
结合我第一篇做的流程图和 idea 生成的流程图,我们下面会重点讲一下左半部分的接口功能,右边类继承会做个简单的讲述.
二.DefaultListableBeanFactory 的接口架构
从左上角开始分析,可以清晰地看出来,DefaultListableBeanFactory 一共实现了哪些接口的方法,也就可以推断出这个容器具备了哪些功能.
(先不考虑 SingletonBeanRegistry)
- BeanFactory
- HierarchicalBeanFactory
- ListableBeanFactory
- AutowireCapableBeanFactory
- ConfigurableBeanFactory
- ConfigurableListableBeanFactory
- SingletonBeanRegistry
- AliasRegistry
- BeanDefinitionRegistry
前四个我们很熟悉,在上一个篇幅我们已经大体讲述了一下接口具有的功能.那么我们从第五个 ConfigurableBeanFactory
开始讲述.
2.1 ConfigurableBeanFactory
从上面的类结构图中我们可以清晰地看到,
ConfigurableBeanFactory
是HierarchicalBeanFactory
的子接口, 而HierarchicalBeanFactory
再上一遍中也描述过,它使 BeanFactory 具备分层的概念.也就是父子容器.
HierarchicalBeanFactory
中的方法只有获取父容器和判断本地 BeanFactory 是否包含指定 name 的 bean.
而 ConfigurableBeanFactory
是 HierarchicalBeanFactory
的子接口,也就体现出 ConfigurableBeanFactory
是在分层能力上的扩展.
ConfigurableBeanFactory 主要功能:
- 设置父容器
- 添加或查询
BeanPostProcessor
,也就是创建 bean 时的前置后置处理器. - 设置类加载器
- 为嵌入值(例如注解属性
@Value(${userName})
)添加String 解析器 - 复制给定的其他 BeanFactory 的所有相关配置
- 摧毁 bean 的实例(全部摧毁或摧毁指定 bean)
- 返回指定 bean 所依赖的所有 bean,和返回依赖指定 bean 的所有 bean
- 返回指定范围的所有 bean (单例 bean 或原型 bean)
- 判断给定 beanName 是否为 FactoryBean
- 给定 bean 名称,创建别名
通过接口名 ConfigurableBeanFactory
和一系列方法的描述,我们可以察觉到,该接口主要的功能就是配置 BeanFactory .
2.2 ConfigurableListableBeanFactory
从上文看下来,可以知道
ConfigurableListableBeanFactory
是ConfigurableBeanFactory
,AutowireCapableBeanFactory
,ListableBeanFactory
三个接口的子接口
所以,实现ConfigurableListableBeanFactory
接口的类,即具备了 BeanFactory 一级子接口的所有功能.而我们本文所讲述的DefaultListableBeanFactory
就是ConfigurableListableBeanFactory
接口的最最主要的核心类
(或者说唯一子类,还有一个是XmlBeanFactory
,他只在DefaultListableBeanFactory
的基础上增加一点点扩展而已,主要还是用的DefaultListableBeanFactory
所实现的功能).
ConfigurableListableBeanFactory 主要功能:
- 冻结所有 bean 定义,表明注册的 bean 定义不会被修改或进一步后处理。
- 返回指定 bean 的已注册 BeanDefinition,
- 根据指定条件忽略依赖注入.忽略某些接口的实现或指定类型的实现
- 判断指定的 bean 是否有资格被依赖注入
- 启动所有非 lazy-init 单例的 bean 实例化(重点)
2.3 SingletonBeanRegistry
提供了一些管理单例 bean 的功能,
主要功能:
- 检查是否包含具有给定名称的单例实例。
- 返回在给定名称下注册的单例对象。
- 返回注册的单例 bean 的数量。
- 返回在注册的单例 bean 的名称数组。
- 在给定的 bean 名称下,在 bean 注册表中将给定的现有对象注册singleton。
2.4 AliasRegistry
别名注册表,用于管理别名的接口。用作BeanDefinitionRegistry的超级接口。
主要用于管理 bean 的别名的
主要功能:
- 返回给定名称的别名
- 判断给定名称是否有别名
- 给指定名称注册别名
- 从此注册表中,删除别名
2.5 BeanDefinitionRegistry
包含 BeanDefinition 的注册表的接口(例如 RootBeanDefinition 和 ChildBeanDefinition 实例).通常由 BeanFactories 实现,BeanFactories 内部使用 AbstractBeanDefinition 层次结构。
这是 Spring 的 BeanFactory 包中唯一封装 BeanDefinition 注册的接口。标准 BeanFactory 接口仅涵盖对完全配置的工厂实例的访问。
核心实现类有 DefaultListableBeanFactory
和 GenericApplicationContext
;
BeanDefinition 是什么
主要功能:
1.检查注册表中是否包含给定名称的 BeanDefinition
2.返回给定 beanName 的 BeanDefinition
3.返回注册表中 BeanDefinition 的数量
4.返回所有 bean 的名称
5.注册 BeanDefinition
6.删除给定 beanName 的 BeanDefinition
三.DefaultListableBeanFactory 的继承框架
看完接口,我们再来看右边的继承关系. spring 的设计架构非常巧妙(废话),本人在看源码的时候也更进一步理解了开闭原则的理念.接口的分层实现和类的分层继承.感觉像上楼梯一样.
我们从上往下看:
3.1 SimpleAliasRegistry
AliasRegistry 接口的简单实现。用作 BeanDefinitionRegistry 实现类的基类 。
有一个 ConcurrentHashMap 类型的字段(aliasMap). 用于存放别名映射(key:别名 value:name)
实现了 AliasRegistry 的所有方法,并添加了一些扩展方法
主要功能:
- 返回是否允许别名覆盖
- 将别名解析为规范名称
- 检查给定名称是否已指向另一个方向的别名作为别名,预先捕获循环引用并抛出相应的IllegalStateException。
- 判断给定的名称时候是别名
- 解析在此工厂中注册的所有别名目标名称和别名,将给定的 StringValueResolver 应用于它们。
3.2 DefaultSingletonBeanRegistry
扩展
SimpleAliasRegistry
类并实现了SingletonBeanRegistry
接口的方法. BeanFactory 的基类.分解了单例 bean 实例的通用管理。请注意,ConfigurableBeanFactory 接口扩展了 SingletonBeanRegistry 接口。
共享 bean 实例的通用注册表,支持在注册表关闭时摧毁实例的注册(BeanDefinition).可以注册 bean 之间的依赖关系以强制执行适当的关闭顺序.
请注意,与AbstractBeanFactory
和DefaultListableBeanFactory
(继承自它)相比,此类既不承担 bean 定义概念也不承担 bean 实例的特定创建过程。
主要功能:
- 将给定的 Singleton 对象添加到此工厂的 Singleton 缓存中
- 单例 bean 创建之前和创建之后的回调
- 清除所有缓存单例 bean
- 返回指定 bean 所依赖的所有 bean 的名称(如果有)和返回依赖于指定 bean 的所有 bean 名称
- 判断指定的单例 bean 当前是否正在创建中(在整个工程中)
- 注册两个 bean 之间的包含关系
- 为给定的 bean 注册一个依赖bean,在销毁给定bean之前销毁它。
- 将给定的 bean 添加到此注册表中的一次性Bean列表中。
3.3 FactoryBeanRegistrySupport
扩展
DefaultSingletonBeanRegistry
,与DefaultSingletonBeanRegistry
集成管理单例 bean
扩展功能主要和 FactoryBean 的操作有关字段
factoryBeanObjectCache
(ConcurrentHashMap 类型) 缓存由 FactoryBean 创建的单例 bean
主要功能:
- 清除缓存
- 返回此 BeanFactory 的安全上下文
- 获取 factoryBean 创建的对象
- 获取指定 bean 的 factoryBean
- 对从FactoryBean获取的给定对象进行后处理
3.4 AbstractBeanFactory
继承
FactoryBeanRegistrySupport
, 实现ConfigurableBeanFactory
.
用于BeanFactory
实现的抽象基类,提供ConfigurableBeanFactory
的全部功能,
可以管理 BeanFactory 层次结构(间接实现了HierarchicalBeanFactory
)由子类实现的主要模板方法
getBeanDefinition(java.lang.String)
和createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
获取一个给定的bean名称的 BeanDefinition,并对于给定的 BeanDefinition 创建一个bean实例. 分别可以在DefaultListableBeanFactory
和AbstractAutowireCapableBeanFactory
中找到这些操作的默认实现 。
主要功能(部分):
- 添加
BeanPostProcessor
,应用于 BeanFactory 创建 bean 时的回调 - 为嵌入值(例如注释属性)添加 String 解析器。
- 添加PropertyEditorRegistrar以应用于所有bean创建过程
- prototype 创建前和创建后的回调方法
- bean 创建失败后,执行适当的缓存元数据清理
- 删除指定 bean 的合并 BeanDefinition,并在下次访问时重新创建它
- 为给定的 BeanDefinition 创建一个 bean 实例(抽象方法,子类实现)
- 返回指定bean的实例,该实例可以是共享的或独立的(
doGetBean
) - 返回指定的原型bean当前是否正在创建(在当前线程内)
主要功能是在 FactoryBeanRegistrySupport
的继承上实现了 ConfigurableBeanFactory
所有方法的功能,并将具体的获取 BeanDefinition 操作和创建 bean 的操作留给子类来实现.
3.5 AbstractAutowireCapableBeanFactory
AbstractBeanFatory 超类,它实现了默认的bean创建,具有 RootBeanDefinition 类指定的全部功能。除了AbstractBeanFactory的
createBean(java.lang.Class <T>)
方法之外,还实现了AutowireCapableBeanFactory接口。提供 bean 创建,属相填充,依赖注入和初始化,
子类实现的主要模板方法是AutowireCapableBeanFactory.resolveDependency(DependencyDescriptor,String,Set,TypeConverter
,用于按类型自动装配请注意,此类不承担或实现 BeanDefinition 注册表功能
主要功能:
- BeanPostProcessors 调用处.
- 依赖的装配
- 初始化 bean 时,回调 init 方法
- 设置实例化策略以用于创建 bean 实例
- 创建 bean
四.DefaultListableBeanFactory 完整的 BeanFactory
Spring的
ConfigurableListableBeanFactory
和BeanDefinitionRegistry
接口的默认实现:一个基于BeanDefinition 元数据的完整bean工厂,可通过后处理器扩展。
真正可以作为一个独立使用的完整的 ioc 容器.
从最上面的图可以看出来, DefaultListableBeanFactory 通过继承 AbstractAutowireCapableBeanFactory 拥有了大多数功能,并在此基础上实现了 ConfigurableListableBeanFactory
和 BeanDefinitionRegistry
接口.使其通过继承和实现接口的方式,变成了一句完整的 BeanFactory. 后期我们所讲的应用上下文applicationContext
都是依赖于它做更高级扩展的.