什么是BeanFactory?
作者:程序员马丁
在线博客:https://open8gu.com
大话面试,技术同学面试必备的八股文小册,以精彩回答应对深度问题,助力你在面试中拿个offer。
回答话术
BeanFactory 是 Spring 中用于管理 Bean 生命周期的核心组件,Spring 官方文档将其称为 IOC 容器,它即是我们一般俗称的 “Spring 容器”。
BeanFactory 是最顶级的接口,里面定义了获取和创建 Bean 的最基本方法,它下面又根据功能和抽象级别细分五个接口:
- ListableBeanFactory:扩展了对 Bean 的批量操作,比如获取所有 Bean 的名称,或者按照类型获取 Bean 等(我们常用的
getBeansOfType方法就是它提供的)。 - HierarchicalBeanFactory:用于支持层次性的
BeanFactory结构,从而实现BeanFactory的嵌套,形成父子关系。 - AutowireCapableBeanFactory:用于提供提供对 Bean 自动装配的支持。
- ConfigurableBeanFactory:它继承了
AutowireCapableBeanFactory和SingletonBeanRegistry,用于提供包括Scope管理、类加载器、上级工厂、表达式解析器……等等各种配置项。 - ConfigurableListableBeanFactory:继承了
ConfigurableBeanFactory和ListableBeanFactory,是集全部BeanFactory接口之大成者。
它的最底层实现类是 DefaultListableBeanFactory,它直接或间接实现了所有 BeanFactory 接口,是在项目中最常用的实现类。
在比较早期的版本中,Spring 基于 DefaultListableBeanFactory 提供了 XmlBeanFactory 它相当于一个具备根据 XML 文件加载 Bean 定义功能的 DefaultListableBeanFactory。
而在更高的版本,Spring 则提供了 ApplicationContext 接口,它继承了 BeanFactory,并且额外通过其他接口获得了加载资源、国际化、时间等扩展功能。
问题详解
1. 基本概念
BeanFactory 是 Spring 中用于管理 Bean 生命周期的核心组件,Spring 官方文档将其称为 IOC 容器,它即是我们一般俗称的 “Spring 容器”,Bean 的注册、实例化、初始化、依赖注入以及销毁等环节都是通过它完成的。
它的最下级实现类即为 DefaultListableBeanFactory,我们在 Spring 或者 SpringBoot 中基本上所有的 BeanFactory 使用的都是它。
当我们谈到 BeanFactory 的时候,实际上谈的不止是 BeanFactory 接口本身,而是以 BeanFactory 为基础扩展出的这一套体系。
如果我们继续往下看,会发现
BeanFactory的更下层就是ApplicationContext,它对应着一个更大的体系。具体参见:什么是 ApplicationContext?
2. BeanFactory
从狭义上的 BeanFactory 接口来说,它抽象可以大致分为三个层级,五大接口:
BeanFactory本身,定义了针对单个 Bean 的一些最基本的访问和创建的方法。- 基于
BeanFactory直接扩展的子接口:- ListableBeanFactory:扩展了对 Bean 的批量操作,比如获取所有 Bean 的名称,或者按照类型获取 Bean 等(我们常用的
getBeansOfType方法就是它提供的)。 - HierarchicalBeanFactory:用于支持层次性的
BeanFactory结构,从而实现BeanFactory的嵌套,形成父子关系。 - AutowireCapableBeanFactory:用于提供提供对 Bean 自动装配的支持。
- ListableBeanFactory:扩展了对 Bean 的批量操作,比如获取所有 Bean 的名称,或者按照类型获取 Bean 等(我们常用的
- 基于上述两者进一步扩展的子接口:
- ConfigurableBeanFactory:它继承了
AutowireCapableBeanFactory和SingletonBeanRegistry,用于提供包括Scope管理、类加载器、上级工厂、表达式解析器……等等各种配置项。 - ConfigurableListableBeanFactory:继承了
ConfigurableBeanFactory和ListableBeanFactory,是集全部BeanFactory接口之大成者。
- ConfigurableBeanFactory:它继承了
整个 BeanFactory体系的最下级实现类即 DefaultListableBeanFactory,它基本可以认为是 BeanFactory的代名词,你在任何地方取到的 BeanFactory 实际上都是基于它工作的。
在 3.1 以及更早的版本之前,Spring 提供了 XmlBeanFactory 它是 DefaultListableBeanFactory 唯一一个子类,等同于在前者的基础上附加一个从 XML 文件加载 Bean 定义的功能。
不过,在更高版本 Spring 则推荐直接使用 ApplicationContext + DefaultListableBeanFactory 的方案,BeanFactory 回归单一职责,只负责管理 Bean,而资源的加载则交给 ApplicationContext实现的其他接口。
- 顺带一提,关于如何基于
AutowireCapableBeanFactory对非 Spring 管理的对象进行依赖注入,请参见:✅ 不被 Spring 管理的对象也能进行依赖注入吗?- 而关于 ApplicationContex,具体参见:什么是 ApplicationContext?
3. SingletonBeanRegistry
SingletonBeanRegistry 表示表示单例 Bean 的注册表,它是一个顶级接口,实现该接口的类具备管理单例 Bean 的功能。ConfigurableBeanFactory接口继承了它,因此所有的 BeanFactory 对单例 Bean 的管理功能都源于此。
从 SingletonBeanRegistry 的体系来说,主要分为两层:
- DefaultSingletonBeanRegistry:它是
SingletonBeanRegistry的通常实现,我们经常提到的三级缓存实际上就是在它里面,单例 Bean 的销毁操作也要基于它完成。 - BeanFactoryRegisterSupport:它是基于
DefaultSingletonBeanRegistry扩展的抽象类,用于在前者的基础上额外为FactoryBean提供支持(毕竟FactoryBean也可以算是单例 Bean)。它的内部有一个factoryBeanObjectCache,FactoryBean的单例产物就缓存于此。
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 容器体系中的重要组成部分。