Spring IOC ( 4 ) : BeanDefinition( 转载 )

Spring IOC ( 四 ) : BeanDefinition( 转载 )

 BeanDefinition
org.springframework.beans.factory.config.BeanDefinition是配置文件<bean>元素标签在容器中内部表示形式。
<bean>元素标签拥有class、scope、lazy-init等配置属性,
BeanDefinition则提供了相应的beanClass、scope、lazyInit属性,BeanDefinition就像是<bean>的镜中人,两者是一一对应的。BeanDefinition接口的继承结构如图5-2所示。

Spring IOC ( 4 ) : BeanDefinition( 转载 )
图5-2  BeanDefinition类继承结构
RootBeanDefinition是最常用的实现类,它对应一般性的<bean>元素标签。我们知道在配置文件中可以定义父<bean>和子<bean>,父<bean>用RootBeanDefinition表示,而子<bean>用ChildBeanDefiniton表示,而没有父<bean>的<bean>就使用RootBeanDefinition表示。AbstractBeanDefinition对两者共同的类信息进行抽象。
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