NightPxy 个人技术博客

SpringBoot - Spring - BeanDefinition

Posted on By NightPxy

概述

BeanDefinition 是Spring容器 对Bean对象如何管理的规则定义

本质上是两个部分

  • BeanDefinition
  • BeanDefinitionRegistry

Spring的对象管理设计

  • BeanDefinition
    BeanDefinition是对Bean对象如何管理的描述定义
  • BeanDefinitionRegistry
    BeanDefinitionRegistry是容器对象管理的统一对外出口

通过这个机制,所有需要纳入到容器管理的对象,都需要通过BeanDefinitionRegistry进行管理注册
而注册管理时,就必须提交如何管理这个对象的BeanDefinition的描述定义
容器对且只需对按这种标准进行提交的对象进行管理,包括Spring容器内部内置,也按照这个标准
这也是我们使用Spring时一个非常重要的关于对象管理的干预和扩展点

这是一个一流的框架设计
框架本身是设定一种机制或者规范,然后对外按照这个机制规范对外提供服务.包括无论是外部扩展还是框架本身也是这个机制规范的遵循.从地位上讲,内置使用和外部扩展没有地位差别
这将为框架带来稳定且强大的扩展能力

BeanDefinition

BeanDefinition 是Spring容器对Bean对象如何管理的规则定义

BeanDefinitionRegistry

内置的管理注册源码解读

容器内会有内置的管理注册
比如依据XML配置或Properties配置,按照使用者的设置将一些对象纳入到容器管理
这里Spring定义了诸如 XmlBeanDefinitionReader,PropertiesBeanDefinitionReader,GroovyBeanDefinitionReader等读取器,来完成指定的扫描读取注册工作

这里以 XmlBeanDefinitionReader 为例,解读一下Spring自身如何完成一个整个的对象注册过程
何时启动执行XmlBeanDefinitionReader,这里暂时略过,暂时以Spring容器会在合适的时候启动这个读取器

XmlBeanDefinitionReader完成注解过程的核心流程如下

  • XmlBeanDefinitionReader本身启动时,会由容器指定Xml扫描读取的路径和容器注入BeanDefinitionRegistry
  • XmlBeanDefinitionReader完成Xml属性读取,将Xml的配置读取解析为统一的BeanDefinitionHolder
  • 将BeanDefinitionHolder们,通过容器注入的BeanDefinitionRegistry,

BeanDefinitionHolder

DefaultBeanDefinitionDocumentReader

BeanDefinition读取器

  • XmlBeanDefinitionReader
  • GroovyBeanDefinitionReader
  • PropertiesBeanDefinitionReader

BeanDefinitionReader

public interface BeanDefinitionReader {

	BeanDefinitionRegistry getRegistry();

	@Nullable
	ResourceLoader getResourceLoader();

	@Nullable
	ClassLoader getBeanClassLoader();

	BeanNameGenerator getBeanNameGenerator();

	int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException;

	int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException;

	int loadBeanDefinitions(String location) throws BeanDefinitionStoreException;

	int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException;

}