什么是BeanFactory?
如何查看更多优质企业面经和精品八股文回答话术?
大话面试小程序提供八股回答、实战项目以及面试真题,助力你在面试中脱颖而出。面对任何技术面试官都信心十足!
# 回答话术
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? (opens new window)
# 2. BeanFactory
从狭义上的 BeanFactory
接口来说,它抽象可以大致分为三个层级,五大接口:
BeanFactory
本身,定义了针对单个 Bean 的一些最基本的访问和创建的方法。基于
BeanFactory
直接扩展的子接口:ListableBeanFactory:扩展了对 Bean 的批量操作,比如获取所有 Bean 的名称,或者按照类型获取 Bean 等(我们常用的
getBeansOfType
方法就是它提供的)。HierarchicalBeanFactory:用于支持层次性的
BeanFactory
结构,从而实现BeanFactory
的嵌套,形成父子关系。AutowireCapableBeanFactory:用于提供提供对 Bean 自动装配的支持。
基于上述两者进一步扩展的子接口:
ConfigurableBeanFactory:它继承了
AutowireCapableBeanFactory
和SingletonBeanRegistry
,用于提供包括Scope
管理、类加载器、上级工厂、表达式解析器……等等各种配置项。ConfigurableListableBeanFactory:继承了
ConfigurableBeanFactory
和ListableBeanFactory
,是集全部BeanFactory
接口之大成者。
整个 BeanFactory
体系的最下级实现类即 DefaultListableBeanFactory
,它基本可以认为是 BeanFactory
的代名词,你在任何地方取到的 BeanFactory
实际上都是基于它工作的。
在 3.1 以及更早的版本之前,Spring 提供了 XmlBeanFactory
它是 DefaultListableBeanFactory
唯一一个子类,等同于在前者的基础上附加一个从 XML 文件加载 Bean 定义的功能。
不过,在更高版本 Spring 则推荐直接使用 ApplicationContext
+ DefaultListableBeanFactory
的方案,BeanFactory
回归单一职责,只负责管理 Bean,而资源的加载则交给 ApplicationContext
实现的其他接口。
- 顺带一提,关于如何基于
AutowireCapableBeanFactory
对非 Spring 管理的对象进行依赖注入,请参见:✅ 不被Spring管理的对象也能进行依赖注入吗? (opens new window) - 而关于 ApplicationContex,具体参见:什么是ApplicationContext? (opens new window)
# 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? (opens new window)
Spring 的 BeanFactory
接口体系中并没有接口继承它,不过 BeanFactory
体系中最底层,也是最常用的实现类 DefaultListableBeanFactory
实现了这个接口。
除此之外,ApplicationContext
的通用实现类 GenericApplicationContext
也实现了这个接口,而大部分的 ApplicationContext
又继承了 GenericApplicationContext
。
总而言之,BeanDefinitionRegistry
和前两者一样,都是 Spring 容器体系中的重要组成部分。