[KANMARS原创] - Spring 源码解析-BeanDefinition
Spring源码解析
Spring BeanDefinition结构
SpringBeanDefinition是一个重要的结构,在spring初始化的时候,ApplicationContext在加载DefaultListableBeanFactory时,会对Spring的xml配置文件进行解析,将每一个标记生成一个BeanDefinition,然后封装为BeanDefinitionHolder,最终存放在DefaultListableBeanFactory中
下图是BeanDefinition的结构图

可以看到BeanDefinition其实就是一个配置项生成的Bean的定义
最常用的BeanDefinition是GenericBeanDefinition
而属性在BeanDefinition中是以PropertiesValue的形式存在的,
每一个PropertiesValue含有两个关键的属性
name,即名称
value,即对应的值,对应的值可能是如下几种类型:
TypedStringValue 字符串
RuntimeBeanReference 运行时Bean指向
BeanDefition 另一个BeanDefition
Ref 动态生成运行时Bean指向
idRef RuntimeBeanNameReference
ManagedArray array
ManagedList list
ManagedSet set
ManagedMap map
ManagedProperties properties
————————————————————————————————————————————————
请期待下一集BeanDefinition的合并
————————————————————————————————————————————————
在BeanDefinition中有这么几个很混淆的定义:
GenericBeanDefinition
AbstractBeanDefinition
RootBeanDefinition
在最开始解析一个Spring标签时,生成的是一个GenericBeanDefinition,并注册到BeanFactory中
在BeanDefinition进行实例化时,会调用AbstractBeanFactory.getMergedBeanDefition方法获取到合并的BeanDefition,即RootBeanDefinition
,在生成RootBeanDefinition时,会传入parentBeanDefinitionmbd = new RootBeanDefinition(parentBeanDefinition);
在RootBeanDefinition的构造方法中,会调用各种方法,将parentBeanDefinition的属性放到RootBeanDefinition中
这样就形成了BeanDefinition和parentBeanDefinition的合并merge机制。
最终获取到的即是RootBeanDefinition
之后再根据RootBeanDefinition对Bean进行实例化。