经过前面的 Spring源码Ioc核心模块分析 的内容介绍之后我想相对刚开始看文章还是比较友好的,目前本文当中主要就是介绍一下,Spring 在运行的时候我们在 xml 所编写的内容它是如何帮我们解析和加载的
容器初始化过程
Spring 解析的 简略
步骤大致是如下几步:
- 解析配置
- 定位与注册对象
然后我们来介绍一下源码,打开 idea 按两下 shift 搜索 BeanDefinition
:
然后鼠标移动到接口上面按 ctrl + alt + shift + u 打开 UML 信息如下:
然后我们只需要关注如下我给出了这些抽象类和实现类即可,具体怎么弄出来的不会的可以去观看我之前发布的 UML 相关概述和使用:
BeanDeifnition
是一个接口,是定义在 spring-beans 模块当中:
- AttributeAccessor:定义了基本的对任意对象的元数据的修改或者获取方法,在 BeanDefinition 当中用过获取其中的属性,并对这些属性进行操作
- BeanMetadataElement:主要是反回 BeanDefinition 这个 Class 对象本身
BeanDefinition 实现类
- AbstractBeanDefinition:定义了公用的构造函数,子类可以通过这些构造函数给通过的属性进行赋值,还定义了一些用属性的 get 与 set 方法,方便对通过的属性赋值,还提供了一些公用的工具方法,设置一些全量初始值
- RootBeanDefinition:它可单独做为 BeanDefinition,也可以做为其它 Definition 的父类,不能做为其它 Definition 的子类,在 spring 当中设置父子关系不是通过
extends
继承,使用parent
引用来指定父子之间的关系
RootBeanDefinition
通常用来在运行时接收多个 BeanDefinition。合并起来的信息。一般情况下配置里面的信息会被解析成 RootBeanDefinition
,在 spring2.5 之后解析成了 GenericBeanDifinition
。
- GenericBeanDefinition:虽然使用
GenericBeanDefinition
取代,但由于之前使用RootBeanDefinition
比较多,在内部还是会使用RootBeanDefinition
来接收,在DefaultListableBeanFactory
类当中,它具有其它BeanDefinition
特征之外, 可以设置parent
属性, 方便程序在运行时, 设定父的Definition
在 idea 当中使用全局搜索 doGetBeanNamesForType
:
- ChildBeanDefinition:不能单独存在, 必须要依赖于一个父的
Definition
,现在已经完全被GenericDefinition
取代