1、如何理解 BeanDefinition ?

按照单词表面信息来看,就是Bean定义,我们可以理解为Bean的元信息。

2、BeanDefinition 中主要包含哪些信息?

它包含了Bean的类信息、属性、行为、依赖关系和配置信息等。

3、BeanDefinition 有哪些类型?分别都有什么特征?

首先我们可以看看 BeanDefinition 的继承树,接着按照 Bean 的注入方式来区分 BeanDefinition 的类型。

2021-07-08阅读小笔记:Spring ioc 之初识 BeanDefinition_BeanDefinition

3.1 GenericBeanDefintion

基于 xml 文件扫描出来的bean定义,BeanDefinition 的类型为 GenericBeanDefintion。

它代表着通用、一般的,所以这种 BeanDefinition 也具有一般性。GenericBeanDefinition 的源码实现非常简单,仅仅是比 AbstractBeanDefinition 多了一个 parentName 属性而已。


AbstractBeanDefinition 作为 BeanDefinition 的抽象实现,它里面已经定义好了一些属性和功能(大部分都有了);属性如 scope、工厂方法、属性列表、初始化/销毁方法等。


3.2 ScannedGenericBeanDefinition

基于 @Component 注解扫描出来的bean定义,BeanDefinition 的类型为 ScannedGenericBeanDefinition。


ScannedGenericBeanDefinition 和 AnnotatedGenericBeanDefinition 一样,都是基于注解驱动下的Bean注册。


ScannedGenericBeanDefinition 继承于GenericBeanDefintion 和实现了 AnnotatedBeanDefinition 接口,在 GenericbeanDefinition 的基础上,包含了注解的元数据,即 AnnotationMetadata。

3.3 ConfigurationClassBeanDefinition

基于配置类和@Bean 扫描出来的bean定义,BeanDefinition 类型为 ConfigurationClassBeanDefinition。

ConfigurationClassBeanDefinition 继承了 RootBeanDefinition 和 实现了 AnnotatedBeanDefinition 接口。ConfigurationClassBeanDefinition 主要包含了注解元数据和方法元数据(工厂方法元数据),即AnnotationMetadata 和 MethodMetadata。


@Bean 可以理解为是利用工厂Bean来获取Bean实例。