BeanDefinition
类关系图
BeanDefinition的实现类
AbstractBeanDefinition
AbstractBeanDefinition是一个抽象类,这个抽象类相当于所有BeanDefinition的模板类,其之类基本包括全部的BeanDefinition实现类,其中GenericBeanDefinition可以描述现在版本的所有BeanDefinition,它的子类分别表示不同的类型的BeanDefinition。
这个抽象类中实现了一些子类的通用方法,减少了代码的复写。
ChildBeanDefinition和RootBeanDefinition
AbstractBeanDefinition还有两个子类ChildBeanDefinition和RootBeanDefinition现在的版本基本不再使用,在2.5之前还没有GenericBeanDefinition就是由这两个实现类来描述BeanDefinition的。
在BeanDefinition中有这么一个方法,是判断是不是抽象的,我们知道如果类是抽象的,那么根本不能实例化,那么这个bd还有什么意义呢?
其实这个是为ChildBeanDefinition和RootBeanDefinition开发的,因为RootBeanDefinition可以作为一个抽象的BeanDefinition,只需要设置一些公共的属性,ChildBeanDefinition可以作为子BeanDefinition接收RootBeanDefinition中设置的属性。
当然也可以在在xml中也可以设置
-
RootBeanDefinition因为它的setParentName方法会直接抛出异常,所以RootBeanDefinition不能作为子BeanDefinition,但可以作为一个独立的BeanDefinition或者父BeanDefinition存在。
-
ChildBeanDefinition因为没有默认的无参构造方法,所有的构造方法都需要设置它的父BeanDefinition,所以ChildBeanDefinition必须作为一个子BeanDefinition存在。
GenericBeanDefinition
- GenericBeanDefinition既可以作为独立的BeanDefinition存在,也可以作为父BeanDefinition存在,同样也可以作为子BeanDefinition存在。
不过在spring初始化bd的时候,在聚合子BeanDefinition和父BeanDefinition的时候,最后还是通过RootBeanDefinition接收的,所以RootBeanDefinition在当前的版本还是有所使用的。
ConfigurationClassBeanDefinition和AnnotatedGenericBeanDefinition
还有一个重要的BeanDefinition的实现类ConfigurationClassBeanDefinition,它继承自RootBeanDefinition。
GenericBeanDefinition同样有两个重要子类AnnotatedGenericBeanDefinition和ScannedGenericBeanDefinition。