Spring的BeanDefinition

Spring的BeanDefinition

AttributeAccessor

AttributeAccessor接口定义了对任意对象的元数据的修改或者获取。

疑问:AttributeAccessor与PropertyAccessor的区别是什么?

AttributeAccessorSupport

对AttributeAccessor的默认实现,其实就是对一个Map<String, Object> attributes的操作。

BeanMetadataElement

定义Bean的源数据,只有一个方法:Object getSource(),这个object为配置源对象,即AttributeAccessor要操纵的对象是谁。

BeanMetadataAttribute

对某个源数据的<属性名, 属性值>的封装,三个字段:属性名(String name),属性值(Object value),源数据(Object source),相当于冗余了这个源数据。

BeanMetadataAttributeAccessor

对AttributeAccessorSupport进行了扩展:增加了addMetadataAttribute和getMetadataAttribute的方法。

PropertyValue

表示某个Bean的某个属性的信息。一个Bean可能会有很多属性,每一个属性的信息都会用PropertyValue来表示:

由于PropertyValue继承自BeanMetadataAttributeAccessor,所以,PropertyValue也持有源数据,所以PropertyValue实际上维护了一个这样的信息:源对象,源对象的某个属性,源对象的这个属性的值,并且可以将这个属性值进行最终的确定。

PropertyValues

PropertyValue的集合,它定义了如下方法:

MutablePropertyValues

PropertyValues的实现,内部使用ArrayList来表示PropertyValue集合。

BeanDefinition

定义实例化Bean时需要的所有信息,这些Bean的信息包括:

AbstractBeanDefinition

BeanDefinition的通用实现。

GenericBeanDefinition

GenericBeanDefinition是一站式的标准bean definition,除了具有指定类、可选的构造参数值和属性参数这些其它bean definition一样的特性外,它还具有通过parenetName属性来灵活设置parent bean definition。

AnnotatedBeanDefinition

该接口扩展了BeanDefinition,增加了获取BeanDefinition中对应的类的注解信息的方法:

其中,AnnotationMetadatam描述了一个类的注解信息,比如这个类被哪些注解所注解,这个类有哪些被注解的方法等等。

AnnotatedBeanDefinition的实现类则表示那些通过注解来获取的BeanDefinition:

以@Configuration注解标记的会解析为AnnotatedGenericBeanDefinition

以@Bean注解标记的会解析为ConfigurationClassBeanDefinition

以@Component(包括@Service\@Controller\@Repository)注解标记的会解析为ScannedGenericBeanDefinition

这些BeanDefinition不是通过对Xml的解析获取的,而是通过解析类中的注解来获取,由Xml定义的Bean会解析为GenericBeanDefinition。

参考

spring笔记-BeanDefinition

Spring4源码解析:BeanDefinition架构及实现

死磕Spring系列之四 BeanDefinition接口、BeanFactory接口

Spring 在 IOC 容器中 Bean 之间的关系

Last updated