Spring容器技术内幕之BeanDefinition类介绍

时间:2022-03-30 08:50:25

引言

org.springframework.beans.factory.config.BeanDefinition是配置文件< bean >元素标签在容器中地内部表示。< bean >元素标签拥有class、scope、lazy-init等配置属性,BeanDefinition则提供了相应地beanClass、scope、lazyInit类属性,BeanDefinition就像< bean >中镜中人,二者是一一对应地。

实现类

RottBeanDefinition是最常用地实现类,它对应一般性地< bean > 元素标签。我们知道,在配置文件中可以定义父< bean >和子< bean >,父< bean >用RootBeanDefiniton表示,子< bean >用ChildBeanDefinition表示,而没有父< bean >的< bean >则用RootBeanDefinition表示。AbstractBeanDefintion对二者共同的类信息进行抽象。
Spring配置文件通过BeanDefintion将配置文件中的< bean >配置信息转换为容器的内部表示,并将这些BeanDefinition注册到BeanDefinitionRegistry中。Spring容器的BeanDefintionRegistry就像Spring配置信息的内存数据库,后续操作直接从BeanDefintionRegistry中读取配置信息。一般情况下,BeanDefinition只在容器启动时加载并解析,除非容器刷新或重启,这些信息不会发生变化。当然,如果用户有特殊的需求,也可以通过编程的方式在运行期调整BeanDefinition的定义。

创建BeanDefinition

创建BeanDefinition主要包括两个步骤:

  1. 利用BeanDefinitionReader读取承载配置信息的Resource,通过XML解析器解析配置信息的DOM对象,简单地每个< bean >生成对应地BeanDefinition对象。但是这里生成的BeanDefinition可能是半成品,因为在配置文件中,可能通过占位符变量引用外部属性文件的属性,这些占位符变量在这一步里还没有被解析出来;
  2. 利用容器中注册的BeanFatoryPostProcessor对半成品的BeanDefinition进行加工处理,将以占位符表示的配置解析为最终的实际值,这样半成品的BeanDefinition就成为成品的BeanDefinition。