SpringFramework — BeanDefinition与BeanDefinitionRegistry

小龙 501 2022-05-18

前言

BeanDefinition 不是凭空出现的,是要配合一个 API 才能完成注册的,IOC 容器中也才能有的,这个API就是 BeanDifinitionRegistry

BeanDefinitionRegistry中存放了所有BeanDefinition

Registry 有注册表的意思,联想下 Windows 的注册表,它存放了 Windows 系统中的应用和设置信息。如果按照这个设计理解,那 BeanDefinitionRegistry 中存放的就应该是 BeanDefinition 的设置信息。其实 SpringFramework 中的底层,对于 BeanDefinition 的注册表的设计,就是一个 Map :

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

BeanDefinitionRegistry中维护了BeanDefinition

另外,Registry 还有注册器的意思,既然 Map 有增删改查,那作为 BeanDefinition 的注册器,自然也会有 BeanDefinition 的注册功能咯。BeanDefinitionRegistry 中有 3 个方法,刚好对应了 BeanDefinition 的增、删、查:

	// 注册 BeanDifinition
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;

	// 删除 BeanDifinition
	void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	// 查找BeanDifinition
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

BeanDefinitionRegistry支撑其它组件运行

该接口中有这样一段注释(javadoc )

Spring's bean definition readers expect to work on an implementation of this interface.

BeanDefinition 的加载器希望可以使用此接口的实现类来支撑逻辑处理。

javadoc 中的 Reader 可以参照上一章提到了 XmlBeanDefinitionReader ,它是用来读取和加载 xml 配置文件的组件。加载 xml 配置文件的目的就是读取里面的配置,和定义好要注册到 IOC 容器的 bean 。XmlBeanDefinitionReader 要在加载完 xml 配置文件后,将配置文件的流对象也好,文档对象也好,交给解析器来解析 xml 文件,解析器拿到 xml 文件后要解析其中定义的 bean ,并且封装为 BeanDefinition 注册到 IOC 容器,这个时候就需要 BeanDefinitionRegistry 了。所以在这个过程中,BeanDefinitionRegistry 会支撑 XmlBeanDefinitionReader 完成它的工作

BeanDefinitionRegistry的主要实现是DefaultListableBeanFactory

BeanDefinitionRegistry 除了有最最常用的 DefaultListableBeanFactory 之外,还有一个不常用的 SimpleBeanDefinitionRegistry ,但这个 SimpleBeanDefinitionRegistry 基本不会去提它,是因为这个设计连内部的 IOC 容器都没有,仅仅是一个 BeanDefinitionRegistry 的表面实现而已,所以我们当然不会用它咯。

面试中如何概述BeanDefinitionRegistry

BeanDifinitionRegistry 是维护 BeanDifinition 的注册中心,它内部存放了 IOC 容器中 Bean 的定义信息,同时 BeanDifinitionRegistry 也是支撑其组件和动态注册 Bean 的重要组件。在 SpringFramework 中,BeanDifinitionRegistry 的实现是 DefaultListableBeanFactory

设计BeanDefinition的意义

定义信息 -> 实例

像我们平时编写 Classnew 出对象一样,SpringFramework 面对一个应用程序,它也需要对其中 bean 进行定义抽取,只有抽取成可以统一类型 / 格式的模型,才能在后续的 bean 对象管理时,进行统一管理,也或者是对特定的 bean 进行特殊化的处理。而这一切的一切,最终落地到统一类型上,就是 BeanDefinition 这个抽象画的模型


# IOC