BeanDefinition简介
BeanDefinition有三个实现类,ChildBeanDefinition、GenericBeanDefinition、RootBeanDefinition,三者都继承 AbstractBeanDefinition,对三个子类共同的类信息进行抽象。如果配置文件中定义了父 和 子 ,则父 用 RootBeanDefinition表示,子 用 ChildBeanDefinition 表示,而没有父 的就使用RootBeanDefinition 表示。GenericBeanDefinition 为一站式服务类。
2. BeanDefinition的属性
之前没有对BeanDefinition属性作详细分析,本文直接开始讲BeanDefintionParserDelegate的方法parseBeanDefinitionAttributes方法。
由于BeanDefinition的实现类都继承自父类AbstractBeanDefinition,父类中有三个引用的属性ConstructorArgumentValues、MutablePropertyValues、MethodOverrides,所以GenericBeanDefinition最终包含的属性如下图:
- id:Bean 的唯一标识名。它必须是合法的 XMLID,在整个 XML 文档中唯一;
- name:用来为 id 创建一个或多个别名。它可以是任意的字母符合。多个别名之间用逗号或空格分开;
- class:用来定义类的全限定名(包名+类名)。只有子类 Bean 不用定义该属性;
- parent:子类 Bean 定义它所引用它的父类 Bean,这是前面的 class 属性失效,子类 Bean 会继承父类 Bean 的所有属性,子类 Bean 也可以覆盖父类 Bean 的属性,注意:子类 Bean 和父类 Bean 是同一个 Java 类;
- abstract(默认为"false"):用来定义 Bean 是否为抽象 Bean。它表示这个 Bean 将不会被实例化,一般用于父类 Bean,因为父类 Bean 主要是供子类 Bean 继承使用;
- lazy-init(默认为"false"):用来定义这个 Bean 是否实现懒初始化。如果为"false",它将在 BeanFactory 启动时初始化所有的 SingletonBean。反之,如果为"true",它只在 Bean 请求时才开始创建 SingletonBean;
- autowire(自动装配,默认为"default"):它定义了 Bean 的自动装载方式;
--"no":不使用自动装配功能;--"byName":通过 Bean 的属性名实现自动装配;--"byType":通过 Bean 的类型实现自动装配;--"constructor":类似于 byType,但它是用于构造函数的参数的自动组装;--"autodetect":通过 Bean 类的反省机制(introspection)决定是