Skip to main content

什么是BeanFactory?

作者:程序员马丁

在线博客:https://open8gu.com

note

大话面试,技术同学面试必备的八股文小册,以精彩回答应对深度问题,助力你在面试中拿个offer。

回答话术

BeanFactory 是 Spring 中用于管理 Bean 生命周期的核心组件,Spring 官方文档将其称为 IOC 容器,它即是我们一般俗称的 “Spring 容器”。

BeanFactory 是最顶级的接口,里面定义了获取和创建 Bean 的最基本方法,它下面又根据功能和抽象级别细分五个接口:

  • ListableBeanFactory:扩展了对 Bean 的批量操作,比如获取所有 Bean 的名称,或者按照类型获取 Bean 等(我们常用的 getBeansOfType 方法就是它提供的)。
  • HierarchicalBeanFactory:用于支持层次性的 BeanFactory 结构,从而实现 BeanFactory 的嵌套,形成父子关系。
  • AutowireCapableBeanFactory:用于提供提供对 Bean 自动装配的支持。
  • ConfigurableBeanFactory:它继承了 AutowireCapableBeanFactorySingletonBeanRegistry ,用于提供包括 Scope 管理、类加载器、上级工厂、表达式解析器……等等各种配置项。
  • ConfigurableListableBeanFactory:继承了 ConfigurableBeanFactoryListableBeanFactory,是集全部 BeanFactory 接口之大成者。

它的最底层实现类是 DefaultListableBeanFactory,它直接或间接实现了所有 BeanFactory 接口,是在项目中最常用的实现类。

在比较早期的版本中,Spring 基于 DefaultListableBeanFactory 提供了 XmlBeanFactory 它相当于一个具备根据 XML 文件加载 Bean 定义功能的 DefaultListableBeanFactory

而在更高的版本,Spring 则提供了 ApplicationContext 接口,它继承了 BeanFactory,并且额外通过其他接口获得了加载资源、国际化、时间等扩展功能。

问题详解

1. 基本概念

BeanFactory 是 Spring 中用于管理 Bean 生命周期的核心组件,Spring 官方文档将其称为 IOC 容器,它即是我们一般俗称的 “Spring 容器”,Bean 的注册、实例化、初始化、依赖注入以及销毁等环节都是通过它完成的。

它的最下级实现类即为 DefaultListableBeanFactory,我们在 Spring 或者 SpringBoot 中基本上所有的 BeanFactory 使用的都是它。

image.png

当我们谈到 BeanFactory 的时候,实际上谈的不止是 BeanFactory 接口本身,而是以 BeanFactory 为基础扩展出的这一套体系。

如果我们继续往下看,会发现 BeanFactory的更下层就是 ApplicationContext ,它对应着一个更大的体系。具体参见:什么是 ApplicationContext?

2. BeanFactory

image.png

从狭义上的 BeanFactory 接口来说,它抽象可以大致分为三个层级,五大接口

  • BeanFactory 本身,定义了针对单个 Bean 的一些最基本的访问和创建的方法。
  • 基于 BeanFactory 直接扩展的子接口:
    • ListableBeanFactory:扩展了对 Bean 的批量操作,比如获取所有 Bean 的名称,或者按照类型获取 Bean 等(我们常用的 getBeansOfType 方法就是它提供的)。
    • HierarchicalBeanFactory:用于支持层次性的 BeanFactory 结构,从而实现 BeanFactory 的嵌套,形成父子关系。
    • AutowireCapableBeanFactory:用于提供提供对 Bean 自动装配的支持。
  • 基于上述两者进一步扩展的子接口:
    • ConfigurableBeanFactory:它继承了 AutowireCapableBeanFactorySingletonBeanRegistry ,用于提供包括 Scope 管理、类加载器、上级工厂、表达式解析器……等等各种配置项。
    • ConfigurableListableBeanFactory:继承了 ConfigurableBeanFactoryListableBeanFactory,是集全部 BeanFactory 接口之大成者。

整个 BeanFactory体系的最下级实现类即 DefaultListableBeanFactory,它基本可以认为是 BeanFactory的代名词,你在任何地方取到的 BeanFactory 实际上都是基于它工作的。

在 3.1 以及更早的版本之前,Spring 提供了 XmlBeanFactory 它是 DefaultListableBeanFactory 唯一一个子类,等同于在前者的基础上附加一个从 XML 文件加载 Bean 定义的功能。

不过,在更高版本 Spring 则推荐直接使用 ApplicationContext + DefaultListableBeanFactory 的方案,BeanFactory 回归单一职责,只负责管理 Bean,而资源的加载则交给 ApplicationContext实现的其他接口。

3. SingletonBeanRegistry

image.png

SingletonBeanRegistry 表示表示单例 Bean 的注册表,它是一个顶级接口,实现该接口的类具备管理单例 Bean 的功能。ConfigurableBeanFactory接口继承了它,因此所有的 BeanFactory 对单例 Bean 的管理功能都源于此。

SingletonBeanRegistry 的体系来说,主要分为两层:

  • DefaultSingletonBeanRegistry:它是 SingletonBeanRegistry 的通常实现,我们经常提到的三级缓存实际上就是在它里面,单例 Bean 的销毁操作也要基于它完成。
  • BeanFactoryRegisterSupport:它是基于 DefaultSingletonBeanRegistry 扩展的抽象类,用于在前者的基础上额外为 FactoryBean 提供支持(毕竟 FactoryBean 也可以算是单例 Bean)。它的内部有一个 factoryBeanObjectCacheFactoryBean 的单例产物就缓存于此。

DefaultSingletonBeanRegistry 为所有的 BeanFactory 提供了管理单例的能力,而 BeanFactoryRegisterSupport 则令 BeanFactory 在前者的基础上具备管理 FactoryBean 产物的能力。

4. BeanDefinitionRegistry

BeanDefinitionRegistry 是 Spring 中用于注册和管理 bean 定义的接口。

bean 定义即 BeanDefinition,它相当于 Spring 容器中 Bean 的元数据,它可以告知 Spring 容器这个 Bean 里面具备哪些属性,具备哪些方法,需要哪些依赖,要如何创建……等等,它与 Bean 的关系等同于 Java 类与根据类创建出的对象的关系。

关于 BeanDefinition,具体请参见:什么是 BeanDefinition?

Spring 的 BeanFactory 接口体系中并没有接口继承它,不过 BeanFactory 体系中最底层,也是最常用的实现类 DefaultListableBeanFactory 实现了这个接口。

除此之外,ApplicationContext 的通用实现类 GenericApplicationContext 也实现了这个接口,而大部分的 ApplicationContext 又继承了 GenericApplicationContext

总而言之,BeanDefinitionRegistry 和前两者一样,都是 Spring 容器体系中的重要组成部分。