1 是什么
Spring中用来描述Bean的类,作用相当于模具,批量生产每一样东西时可以先制造模具,模具记录着尺寸,形状等详细信息,可以加快生产效率,BeanDefinition的作用也是类似的,记录着Bean的scope,lazy,class等信息,需要Bean对象时可以根据BeanDefinition记录的属性信息可以创建并初始化该Bean对象。
Spring的生命周期就是根据xml元数据配置+注解元数据配置+java Configuration元数据配置初始化BeanDefinition,并根据初始化的初始化BeanDefinition对象来实例化,初始化需要的java对象。
BeanDefinition的类结构图
2 BeanDefinition两个父接口
2.1 AttributeAccessor
用来操作描述BeanDefinition额外的元数据,这部分元数据使用Spring中的BeanDefinition描述不了的。
到底是描述Bean还是BeanDefinition的额外的元数据有点搞不清楚?
其实现类为AttributeAccessorSupport。
2.2 BeanMetadataElement
保存Bean Class在磁盘中文件的全路径信息,
其实现类为BeanMetadataAttributeAccessor。
只是通过注解扫描到的Bean才有该属性值。
3 BeanDefinition的实现
不用方式注入的Bean生成的BeanDefinition对象的类型不同。
3.1 RootBeanDefinition
用途一:作为一个父BeanDefinition,让别的BeanDefinition继承
仅仅作为父BeanDefinition用途时没有设置BeanClass一定要设置Bean是抽象,在Spring的生命周期中会对子BeanDefinition和父BeanDefinition进行合并。
用途二:一个真实的BeanDefinition
作为真实的BeanDefinition时一定要指定BeanClass,并且不能设置Bean是抽象的。
不能作为子BeanDefinition出现,
3.2 ChildBeanDefinition
Spring2.5时首选的BeanDefinition,目前已经淘汰,使用时一定要指定父BeanDefinition的名称,只能作为子BeanDefinition存在。
3.2 GenericBeanDefinition
通过xml配置的Bean由XmlBeanDefinitionReader扫描生成GenericBeanDefinition对象。
通用的BeanDefinition对象,可以完全替代ChildrenBeanDefinition,但是不能完全替代RootBeanDefinition,因为在有父子BeanDefinition的情况下,合并完成的BeanDefinition对象是RootBeanDefinition。
3.3 ScannedGenericBeanDefinition
通过**@Component 注解配置的Bean由AnnotatedBeanDefinitionReader扫描生成ScannedGenericBeanDefinition**对象。
3.5 AnnotatedGenericBeanDefinition
配置元数据的方式采用Java Configuration时,描述配置类Bean的BeanDefinition对象以及在配置类中使用@Import导入的BeanDefinition对象为ConfigurationClassBeanDefinition对象。
3.5 ConfigurationClassBeanDefinition
配置元数据的方式采用Java Configuration时,在配置类中使用@Bean注入的BeanDefinition对象为ConfigurationClassBeanDefinition对象。