Spring IOC 源码解析(三) DefaultListableBeanFactory

一.前言

在第一篇的时候我们就讲过, spring ioc 的实现,主要的有两条实现分支,而 DefaultListableBeanFactory 的实现就是我们的第一个 BeanFactory 主要实现分支.

来看一下 DefaultListableBeanFactory 的类结构:
在这里插入图片描述

结合我第一篇做的流程图和 idea 生成的流程图,我们下面会重点讲一下左半部分的接口功能,右边类继承会做个简单的讲述.

二.DefaultListableBeanFactory 的接口架构

从左上角开始分析,可以清晰地看出来,DefaultListableBeanFactory 一共实现了哪些接口的方法,也就可以推断出这个容器具备了哪些功能.
(先不考虑 SingletonBeanRegistry)

  1. BeanFactory
  2. HierarchicalBeanFactory
  3. ListableBeanFactory
  4. AutowireCapableBeanFactory
  5. ConfigurableBeanFactory
  6. ConfigurableListableBeanFactory
  7. SingletonBeanRegistry
  8. AliasRegistry
  9. BeanDefinitionRegistry

前四个我们很熟悉,在上一个篇幅我们已经大体讲述了一下接口具有的功能.那么我们从第五个 ConfigurableBeanFactory 开始讲述.

2.1 ConfigurableBeanFactory

从上面的类结构图中我们可以清晰地看到, ConfigurableBeanFactoryHierarchicalBeanFactory 的子接口, 而 HierarchicalBeanFactory 再上一遍中也描述过,它使 BeanFactory 具备分层的概念.也就是父子容器.

HierarchicalBeanFactory 中的方法只有获取父容器和判断本地 BeanFactory 是否包含指定 name 的 bean.

ConfigurableBeanFactoryHierarchicalBeanFactory 的子接口,也就体现出 ConfigurableBeanFactory 是在分层能力上的扩展.

ConfigurableBeanFactory 主要功能:

  1. 设置父容器
  2. 添加或查询 BeanPostProcessor,也就是创建 bean 时的前置后置处理器.
  3. 设置类加载器
  4. 为嵌入值(例如注解属性@Value(${userName}))添加String 解析器
  5. 复制给定的其他 BeanFactory 的所有相关配置
  6. 摧毁 bean 的实例(全部摧毁或摧毁指定 bean)
  7. 返回指定 bean 所依赖的所有 bean,和返回依赖指定 bean 的所有 bean
  8. 返回指定范围的所有 bean (单例 bean 或原型 bean)
  9. 判断给定 beanName 是否为 FactoryBean
  10. 给定 bean 名称,创建别名

通过接口名 ConfigurableBeanFactory 和一系列方法的描述,我们可以察觉到,该接口主要的功能就是配置 BeanFactory .

2.2 ConfigurableListableBeanFactory

从上文看下来,可以知道 ConfigurableListableBeanFactoryConfigurableBeanFactory ,AutowireCapableBeanFactory,ListableBeanFactory 三个接口的子接口
所以,实现 ConfigurableListableBeanFactory 接口的类,即具备了 BeanFactory 一级子接口的所有功能.而我们本文所讲述的 DefaultListableBeanFactory 就是 ConfigurableListableBeanFactory 接口的最最主要的核心类
(或者说唯一子类,还有一个是 XmlBeanFactory,他只在 DefaultListableBeanFactory 的基础上增加一点点扩展而已,主要还是用的 DefaultListableBeanFactory 所实现的功能).

ConfigurableListableBeanFactory 主要功能:

  1. 冻结所有 bean 定义,表明注册的 bean 定义不会被修改或进一步后处理。
  2. 返回指定 bean 的已注册 BeanDefinition,
  3. 根据指定条件忽略依赖注入.忽略某些接口的实现或指定类型的实现
  4. 判断指定的 bean 是否有资格被依赖注入
  5. 启动所有非 lazy-init 单例的 bean 实例化(重点)

2.3 SingletonBeanRegistry

提供了一些管理单例 bean 的功能,

主要功能:

  1. 检查是否包含具有给定名称的单例实例。
  2. 返回在给定名称下注册的单例对象。
  3. 返回注册的单例 bean 的数量。
  4. 返回在注册的单例 bean 的名称数组。
  5. 在给定的 bean 名称下,在 bean 注册表中将给定的现有对象注册singleton。

2.4 AliasRegistry

别名注册表,用于管理别名的接口。用作BeanDefinitionRegistry的超级接口。
主要用于管理 bean 的别名的

主要功能:

  1. 返回给定名称的别名
  2. 判断给定名称是否有别名
  3. 给指定名称注册别名
  4. 从此注册表中,删除别名

2.5 BeanDefinitionRegistry

包含 BeanDefinition 的注册表的接口(例如 RootBeanDefinition 和 ChildBeanDefinition 实例).通常由 BeanFactories 实现,BeanFactories 内部使用 AbstractBeanDefinition 层次结构。

这是 Spring 的 BeanFactory 包中唯一封装 BeanDefinition 注册的接口。标准 BeanFactory 接口仅涵盖对完全配置的工厂实例的访问。

核心实现类有 DefaultListableBeanFactoryGenericApplicationContext;
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 的所有方法,并添加了一些扩展方法

主要功能:

  1. 返回是否允许别名覆盖
  2. 将别名解析为规范名称
  3. 检查给定名称是否已指向另一个方向的别名作为别名,预先捕获循环引用并抛出相应的IllegalStateException。
  4. 判断给定的名称时候是别名
  5. 解析在此工厂中注册的所有别名目标名称和别名,将给定的 StringValueResolver 应用于它们。

3.2 DefaultSingletonBeanRegistry

扩展 SimpleAliasRegistry 类并实现了 SingletonBeanRegistry 接口的方法. BeanFactory 的基类.分解了单例 bean 实例的通用管理。请注意,ConfigurableBeanFactory 接口扩展了 SingletonBeanRegistry 接口。

共享 bean 实例的通用注册表,支持在注册表关闭时摧毁实例的注册(BeanDefinition).可以注册 bean 之间的依赖关系以强制执行适当的关闭顺序.
请注意,与 AbstractBeanFactoryDefaultListableBeanFactory(继承自它)相比,此类既不承担 bean 定义概念也不承担 bean 实例的特定创建过程。

主要功能:

  1. 将给定的 Singleton 对象添加到此工厂的 Singleton 缓存中
  2. 单例 bean 创建之前和创建之后的回调
  3. 清除所有缓存单例 bean
  4. 返回指定 bean 所依赖的所有 bean 的名称(如果有)和返回依赖于指定 bean 的所有 bean 名称
  5. 判断指定的单例 bean 当前是否正在创建中(在整个工程中)
  6. 注册两个 bean 之间的包含关系
  7. 为给定的 bean 注册一个依赖bean,在销毁给定bean之前销毁它。
  8. 将给定的 bean 添加到此注册表中的一次性Bean列表中。

3.3 FactoryBeanRegistrySupport

扩展 DefaultSingletonBeanRegistry ,与 DefaultSingletonBeanRegistry 集成管理单例 bean
扩展功能主要和 FactoryBean 的操作有关

字段 factoryBeanObjectCache(ConcurrentHashMap 类型) 缓存由 FactoryBean 创建的单例 bean

主要功能:

  1. 清除缓存
  2. 返回此 BeanFactory 的安全上下文
  3. 获取 factoryBean 创建的对象
  4. 获取指定 bean 的 factoryBean
  5. 对从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实例. 分别可以在 DefaultListableBeanFactoryAbstractAutowireCapableBeanFactory 中找到这些操作的默认实现 。

主要功能(部分):

  1. 添加 BeanPostProcessor ,应用于 BeanFactory 创建 bean 时的回调
  2. 为嵌入值(例如注释属性)添加 String 解析器。
  3. 添加PropertyEditorRegistrar以应用于所有bean创建过程
  4. prototype 创建前和创建后的回调方法
  5. bean 创建失败后,执行适当的缓存元数据清理
  6. 删除指定 bean 的合并 BeanDefinition,并在下次访问时重新创建它
  7. 为给定的 BeanDefinition 创建一个 bean 实例(抽象方法,子类实现)
  8. 返回指定bean的实例,该实例可以是共享的或独立的(doGetBean )
  9. 返回指定的原型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 注册表功能

主要功能:

  1. BeanPostProcessors 调用处.
  2. 依赖的装配
  3. 初始化 bean 时,回调 init 方法
  4. 设置实例化策略以用于创建 bean 实例
  5. 创建 bean

四.DefaultListableBeanFactory 完整的 BeanFactory

Spring的 ConfigurableListableBeanFactoryBeanDefinitionRegistry 接口的默认实现:一个基于BeanDefinition 元数据的完整bean工厂,可通过后处理器扩展。

真正可以作为一个独立使用的完整的 ioc 容器.

从最上面的图可以看出来, DefaultListableBeanFactory 通过继承 AbstractAutowireCapableBeanFactory 拥有了大多数功能,并在此基础上实现了 ConfigurableListableBeanFactoryBeanDefinitionRegistry 接口.使其通过继承和实现接口的方式,变成了一句完整的 BeanFactory. 后期我们所讲的应用上下文applicationContext 都是依赖于它做更高级扩展的.

Spring IOC 源码解析(四) BeanDefinition

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值