目录
ConfigurationClassBeanDefinition
AnnotatedGenericBeanDefinition
合并了的bean定义--MergedBeanDefinition
本文是笔者阅读Spring源码的记录文章,由于本人技术水平有限,在文章中难免出现错误,如有发现,感谢各位指正。很多内容来自别人博客
简介
现如今,我们一般获取对象的方式有两种,一种是手动直接 new;另一种是交给 Spring 管理,Spring 将管理的对象称之为 Bean,容器会先实例化 Bean,然后自动注入,实例化的过程就需要依赖 BeanDefinition。
对于基于Spring框架开发的一个应用系统,其中每一个bean都来自于一个bean定义:开发人员的某个bean定义,框架自身的某个bean定义,三方库的某个bean定义。
这些概念上的bean定义,通过Spring接口BeanDefinition被建模,并且在应用运行时都会以一个BeanDefinition对象的形式被注册到Spring IoC容器中。所以说,bean定义,或者说,BeanDefinition接口,是整个Spring容器的根本概念之一。
BeanDefinition 用于保存 Bean 的相关信息,包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等,它是实例化 Bean 的原材料,Spring 就是根据 BeanDefinition 中的信息实例化 Bean。
接口BeanDefinition
简介
Spring
框架中的接口BeanDefinition
顾名思义,就是"bean定义"的意思,它定义了创建相应的bean
使用如下属性 :
属性名称 | 介绍 |
---|---|
parentName |
双亲bean 定义(parent bean definition )的名称.如果没有双亲bean定义,这里为空 |
beanClassName | bean 的类名,在bean factory 的post process 阶段可能会被修改。注意该属性并不总是运行时被对应bean 真正使用的类的名称:比如,bean 是通过某个类的静态工厂方法生成的,这里是该类的类名,再比如,bean 是通过一个工厂bean 生成的,那这里为空。 |
scope |
作用域, singleton 或者prototype 。在bean 的作用域尚未决定之前,该属性为null |
lazyInit |
是否懒加载,仅适用于singleton bean 。当一个singleton bean 被指定lazyInit 为false 时,它会在bean factory 启动时执行singleton bean 初始化的阶段被实例化。 |
dependsOn |
所依赖的bean 的名称,如果有多个依赖的bean ,这里需要都列出来。容器会保证这些被依赖的bean 先被初始化。 |
autowireCandidate |
该bean 是否作为自动绑定的候选,仅适用于基于类型的自动绑定。基于名称的绑定不受此属性影响。 |
primary |
当前bean 定义是否主bean 。当某个自动绑定遇到多个候选bean 时,primary 属性为true 的会被使用。 |
factoryBeanName |
如果要使用factory bean 来创建bean ,这里指定了相应的工厂bean 的类名称 |
factoryMethodName | 工厂方法名称。基于类静态工厂方法的情况下,结合beanClassName 使用;基于工厂bean 的情况下,结合factoryBeanName 使用。如果bean 定义的constructorArgumentValues 有内容,工厂方法被调用时会使用该属性。 |
constructorArgumentValues |
bean 创建时的构造函数参数 |
propertyValues |
新建的bean 需要设置的属性值 |
initMethodName |
bean 的初始化方法 |
destroyMethodName |
bean 的析构方法 |
role |
bean 的角色:APPLICATION ,SUPPORT ,INFRASTRUCTURE 。提示框架该bean 的角色和重要程度。 |
description |
bean 的描述,human readable |
singleton |
作用域断言,是否singleton |
prototype |
作用域断言,是否prototype |
abstract |
是否抽象bean 定义,抽象bean 定义的目的不是用于实例化bean ,而是有其他目的。 |
resourceDescription |
资源描述文本,告知当前bean 定义的来源,一般用于错误时显示上下文。 |
originatingBeanDefinition | 返回来源bean定义(如果有的话)。通过该属性,可以获取被修饰的bean定义。需要注意的是该属性仅仅返回直接来源bean定义而不是返回最深处的来源bean定义。一个bean定义的originatingBeanDefinition属性隐含了一个来源bean定义链,通过迭代访问该链,可以最终找到最终来自用户的bean定义。 |
上表中提到的bean的角色,分别是:
- APPLICATION – 指出该bean是应用程序的主要部分,通常对应用户定义的bean。
- SUPPORT – 应用支持性质的bean,在某些地方比较重要,但从整个应用的返回来看,还没那么重要。
- INFRASTRUCTURE – 基础设施bean,仅仅用于框架内部工作,跟终端用户无关。
接口BeanDefinition
实现类简介
BeanDefinition 接口有一些实现类,并且这些实现类有一些共同的基础逻辑。这些实现类主要是 : RootBeanDefinition,ChildBeanDefinition和GenericBeanDefinition。它们共同的基础逻辑实现在抽象类AbstractBeanDefinition。这些类之间的层级关系如下:
根据类图看到BeanDefinition有GenericBeanDefinition
、ChildBeanDefinition
、RootBeanDefinition
三个实现类;
BeanDefinition是配置文件<bean>元素标签在容器中内部表示形式。
RootBeanDefinition
可以单独作为一个BeanDefinition
,也可以作为其他BeanDefinition
的父类。但是他不能作为其他BeanDefinition的子类ChildBeanDefinition
相当于一个子类,不可以单独存在,必须要依赖一个父BeanDetintion
。GenericBeanDefinition
可以替代RootBeanDefinition
和ChildBeanDefinition
AnnotatedGenericBeanDefinition
处理@
Configuration
注解ConfigurationClassBeanDefinition
处理@Bean
注解ScannedGenericBeanDefinition
处理@Component
注解
一般情况下,建议使用
GenericBeanDefinition
用于定义用户可见的bean
定