什么是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 容器体系中的重要组成部分。