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时,会传入parentBeanDefinition
mbd = new RootBeanDefinition(parentBeanDefinition);

在RootBeanDefinition的构造方法中,会调用各种方法,将parentBeanDefinition的属性放到RootBeanDefinition中

这样就形成了BeanDefinition和parentBeanDefinition的合并merge机制。
最终获取到的即是RootBeanDefinition
之后再根据RootBeanDefinition对Bean进行实例化。