BeanDefinition
org.springframework.beans.factory.config.BeanDefinition
是配置文件<bean>元素标签在容器中内部表示形式。
<bean>元素标签拥有class、scope、lazy-init等配置属性,
BeanDefinition
则提供了相应的beanClass、scope、lazyInit属性,
BeanDefinition
就像是<bean>的镜中人,两者是一一对应的。
BeanDefinition
接口的继承结构如图5-2所示。
图5-2 BeanDefinition类继承结构 |
Spring通过 BeanDefinition 将配置文件中的<bean>配置信息转换为容器的内部表示,并将这些 BeanDefiniton 注册到 BeanDefinitonRegistry 中。Spring容器的 BeanDefinitionRegistry 就像是Spring配置信息的内存数据库,后续操作直接从 BeanDefinitionRegistry 中读取配置信息。一般情况下, BeanDefinition 只在容器启动时加载并解析,除非容器刷新或重启,这些信息不会发生变化,当然如果用户有特殊的需求,也可以通过编程的方式在运行期调整 BeanDefinition 的定义。
创建最终的 BeanDefinition 主要包括两个步骤:
1)利用 BeanDefinitionReader 对配置信息 Resource 进行读取,通过XML解析器解析配置信息的DOM对象,简单地为每个<bean>生成对应的 BeanDefinition 对象。但是这里生成的 BeanDefinition 可能是半成品,因为在配置文件中,我们可能通过占位符变量引用外部属性文件的属性,这些占位符变量在这一步还没有被解析出来。
2)利用容器中注册的 BeanFactoryPostProcessor 对半成品的 BeanDefinition 进行加工处理,将以占位符表示的配置解析为最终的实际值,这样半成品的 BeanDefinition 就为成品的 BeanDefinition 。