前言
BeanDefinition:顾名思义,就是 Bean 的定义,是用来形容一个 Bean 都有什么信息。后面说在初始化 DefaultListableBeanFactory
时,会初始化一个 Map<String, BeanDefinition>
,这个 Map 的性能暂且不说,(PS:查资料说的是存储 bean),所以明天就联合官网文档以及源码,一起理解一下 BeanDefinition
!
概念
在容器外部,应用 BeanDefinition
对象定义一个 Bean。而定义的信息蕴含 类名、作用域、是否懒加载、结构参数、初始化办法、销毁形式等等。
理解了概念之后,开始浏览源码,源码局部比拟长。
源码介绍
通过 UML 能够看出 BeanDefinition 接口继承了 AttributeAccessor 和 BeanMetadataElement 两个接口。
AttributeAccessor
AttributeAccessor:定义用于将元数据附加到任意对象或从任意对象拜访元数据的通用协定的接口。
public interface AttributeAccessor { void setAttribute(String name, @Nullable Object value); @Nullable Object getAttribute(String name); @Nullable Object removeAttribute(String name); boolean hasAttribute(String name); String[] attributeNames();}
通过接口办法能够看出,AttributeAccessor 次要定义了对元数据属性
的增删改查。
AttributeAccessorSupport
是 AttributeAccessor 接口的一个实现,通过实现能够看出,其外部应用了 Map 保留名称和属性值。
BeanMetadataElement
BeanMetadataElement:由蕴含配置源对象的 bean 元数据元素实现的接口。
public interface BeanMetadataElement { @Nullable default Object getSource() { return null; }}
接口外部只有一个 getSource()
办法,其含意为:返回此元数据元素的配置源Object (能够为null )。
其实还是不晓得啥意思……
在子类(BeanMetadataAttributeAccessor
)中加上断点,debug
这里 source 外面存储了 Class 类文件在磁盘的实在门路。当然权且能够这么认为,毕竟我这也是刚开始学习源码,以后的论断只是 debug 到的,也有可能在别的实现类中存储的是别的信息。
BeanDefinition
BeanDefinition 办法较多,就不贴代码,或者截图了。具体能够通过 我的 GitHub 进行浏览,下面增加了相干正文。
不过还是简要介绍一下办法,大略有 Bean 的名字、作用范畴、是否首选、以及 Bean 的初始化销毁办法等等。
BeanDefinition 只是一个接口,其实现又分为好几种。
AbstractBeanDefinition
AbstractBeanDefinition 作为 BeanDefinition 的形象实现类,外部定义了很多属性,以满足 BeanDefinition 定义的接口性能。
这些属性的操作,就对应着 BeanDefinition 定义的接口办法。
AbstractBeanDefinition 的三个实现类
AbstractBeanDefinition 的实现又分为三个:别离是 ChildBeanDefinition
、 RootBeanDefinition
、 GenericBeanDefinition
。
- ChildBeanDefinition:能够从 Parent Definition 外面继承一些公共定义(初始化办法、销毁办法、是否懒加载等等)不过
- RootBeanDefinition:定义 Bean Definition 的公共属性,该定义在运行时反对Spring BeanFactory中的特定bean。 而 RootBeanDefinition 是不能够设置 parentName 指定 Parent Definition 的。
- GenericBeanDefinition:是一个通用的 Bean Definition,是一站式服务,用于规范bean定义。 像任何bean定义一样,它容许指定一个类以及可选的构造函数参数值和属性值。 另外,能够通过
parentName
属性灵便地配置从父bean定义派生的内容。所以当初个别应用 GenericBeanDefinition。
从 Spring 2.5 开始,以编程形式注册 Bean Definition 的首选办法是 GenericBeanDefinition 类,该类容许通过 GenericBeanDefinition.setParentName 办法动静定义父依赖项。
GenericBeanDefinition 上面还有两个实现:ScannedGenericBeanDefinition
、AnnotatedGenericBeanDefinition
。
二者并无太大区别,只不过 AnnotatedGenericBeanDefinition
比 ScannedGenericBeanDefinition
多了一个 factoryMethodMetadata
的定义。
总结
通过浏览 BeanDefinition 的源码,并对其实现类的源码进行浏览之后,大抵理解 BeanDefinition 的概念及其含意。大略作图总结如下:
相干举荐
- Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory
- Spring 源码学习 03:创立 IoC 容器的几种形式
- Spring 源码学习 02:对于 Spring IoC 和 Bean 的概念