Spring Framework版本:5.1.6.RELEASE (点击跳转官方文档)
BeanDefinition 是 Spring 框架中的一个概念,它是描述在 Spring 容器中所管理的 Bean 的元数据信息。可以将 BeanDefinition 理解为 Spring 容器中 Bean 的配置信息,它定义了实例化和配置特定 Bean 所需的属性和依赖项,包括 Bean 的类名、作用域、构造函数参数、属性值等等,通过这些信息,Spring 容器能够在运行时动态地创建和管理对象实例。
BeanDefinition 在 Spring 生命周期中的前半部分被使用,主要是在 Spring 容器启动阶段和进行 Bean 的实例化及依赖注入的过程中使用。
在 Spring 容器启动过程中的 预处理阶段 ,会对应用程序中的各种资源(如 XML 配置文件、注解类、Java 配置类等)进行扫描解析,Spring 容器会根据不同的资源类型采用不同的解析方式,最终将解析出来的信息封装成 BeanDefinition 对象,BeanDefinition 中包含了 Bean 的基本信息,例如 Bean 的类名、作用域、构造函数参数、属性值等等。
在 实例化阶段,Spring 容器根据 BeanDefinition 的定义,对 Bean 进行实例化,生成 Bean 的实例对象,并根据 BeanDefinition 中的属性信息对其进行属性注入。
当 Bean 实例化后,如果该 Bean 有其他 Bean 的依赖关系,Spring 容器会根据 BeanDefinition 中定义的依赖关系,注入所依赖的其他 Bean,这个过程称为依赖注入。依赖注入的方式包括构造函数注入、属性注入、接口注入等。
需要注意的是,实例化和依赖注入并不是一次性完成的,而是分多个阶段完成的。在实例化阶段,Spring 容器会先生成 Bean 的实例对象,然后再进行属性注入。在依赖注入阶段,会先进行简单类型的属性注入,然后再进行其他 Bean 的依赖注入。
因此,BeanDefinition 实例化和依赖注入之间的顺序是先实例化 Bean,再进行依赖注入。这个过程是在 Spring 容器启动阶段完成的,而且是在 预处理阶段 和 实例化阶段 进行的。
1. 继承关系
2. AnnotatedBeanDefinition
AnnotatedBeanDefinition 用于表示使用注解方式定义的 BeanDefinition。
注解方式定义是指使用注解(如 @Component、@Service、@Repository、@Controller 等)来标记 Bean 类的方式,这种方式相对于 XML 配置文件的方式更加简洁、直观、易于维护。
3. AbstractBeanDefinition
BeanDefinition 接口的子抽象类,也是其余 BeanDefinition 类的基类。
AbstractBeanDefinition 子抽象类对 BeanDefinition 接口中定义的大部分方法进行了实现,并定义了一系列常量及默认字段,几乎包含了一个 Bean 所有的元信息。
4. GenericBeanDefinition
继承自 AbstractBeanDefinition ,该类中定义了 parentName
属性,表示有继承关系,这意味着允许动态定义父依赖项。通过 XML 定义的 Bean 会解析成该对象。
parentName
属性用于指定该 BeanDefinition 所继承的父 BeanDefinition 的名称。当 BeanFactory 创建一个 Bean 实例时,它会检查该 BeanDefinition 是否指定了 parentName 属性。如果指定了,则会首先创建父 BeanDefinition,然后将其属性复制到子 BeanDefinition 中,以确保子 BeanDefinition 可以继承其父 BeanDefinition 中的所有属性。
源码位置
- BeanDefinitionParserDelegate#parseBeanDefinitionElement
- BeanDefinitionParserDelegate#createBeanDefinition
- BeanDefinitionReaderUtils#createBeanDefinition
5. AnnotatedGenericBeanDefinition
用于定义基于注解的 Bean 的元数据信息。
其自身包含了 AnnotationMetadata metadata
和 MethodMetadata factoryMethodMetadata
两个属性:
AnnotationMetadata metadata
:保存 Bean 类的注解元数据信息MethodMetadata factoryMethodMetadata
:保存工厂方法的元数据信息,如果当前 Bean 是通过工厂方法创建的。
AnnotationMetadata metadata
属性是 AnnotatedGenericBeanDefinition 类的核心属性,它保存了 Bean 类的注解元数据信息,用于识别和解析 Bean 定义。
6. ScannedGenericBeanDefinition
用于描述通过扫描组件(Component Scanning)方式注册的 Bean 的元数据信息。@Component
注解及派生注解定义的 Bean 会被解析成 ScannedGenericBeanDefinition
。
其自身包含 AnnotationMetadata metadata
属性,用于保存 Bean 类的注解元数据信息。当使用扫描组件的方式自动注册 Bean 时,Spring 会使用 AnnotationMetadataReadingVisitor 类解析 Bean 类的注解元数据信息,并将其保存到 metadata 属性中。因此,metadata 属性是 ScannedGenericBeanDefinition 的核心属性,它描述了通过扫描组件注册的 Bean 的元数据信息。
7. RootBeanDefinition
8. ConfigurationClassBeanDefinition
9. BeanDefinitionHolder
Spring 容器的启动阶段,所有的 BeanDefinition 都会被注册到 BeanFactory 或 ApplicationContext 中,并且每个 BeanDefinition 都会有一个对应的名称。为了方便管理 BeanDefinition 和 对应名称,因此 Spring 将 BeanDefinition 和对应名称包装在一个 BeanDefinitionHolder 中,这样便于统一的管理和处理。