前言
前面上篇介绍了 BeanDefinition 接口,Spring 对其 Bean 的定义。
竟然已经对 Bean 建模了,那么接下来就是具体实现。这篇就是介绍主要的实现类。
AbstractBeanDefinition
AbstractBeanDefinition 是 BeanDefinition 的直接实现类,从类名也知道,它是一个抽象的 BeanDefinition,还不够具体。
AbstractBeanDefinition 已经对 BeanDefinition 方法有了基本实现逻辑,增加了许多新的属性(默认属性)。
看一些主要的默认属性
public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
implements BeanDefinition, Cloneable {
// 默认作用域
public static final String SCOPE_DEFAULT = "";
// 四种注入模型
public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;
public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;
// 默认注入模型为 AUTOWIRE_NO
private int autowireMode = AUTOWIRE_NO;
// 以下是实现 BeanDefinition 接口里的方法所需定义的属性
@Nullable
private String[] dependsOn;
private boolean autowireCandidate = true;
private boolean primary = false;
...
@Nullable
private String factoryBeanName;
@Nullable
private String factoryMethodName;
@Nullable
private ConstructorArgumentValues constructorArgumentValues;
@Nullable
private MutablePropertyValues propertyValues;
private MethodOverrides methodOverrides = new MethodOverrides();
@Nullable
private String initMethodName;
@Nullable
private String destroyMethodName;
private boolean enforceInitMethod = true;
private boolean enforceDestroyMethod = true;
private int role = BeanDefinition.ROLE_APPLICATION;
@Nullable
private String description;
@Nullable
private Resource resource;
RootBeanDefinition
RootBeanDefinition 继承了 AbstractBeanDefinition,这是一个具体 BeanDefinition,有实际作用。
A root bean definition represents the merged bean definition that backs a specific bean in a Spring BeanFactory at runtime.
一个 RootBeanDefinition 表示它是一个可合并的 BeanDefinition,会在 BeanFactory 解析的时候合成一个完整的 BeanDefinition。
如果不理解上面意思也没关系,只需要记住这个 RootBeanDefinition 在实例化一个 Bean 的时候,需要与其他的 BeanDefinition 进行合并。比如这个 Bean 继承了某个类或继承了某个 Bean,亦或是实现了某个接口。
ChildBeanDefinition
ChildBeanDefinition 继承了 AbstractBeanDefinition,这也是一个具体 BeanDefinition,同样有着实际作用。
Bean definition for beans which inherit settings from their parent. Child bean definitions have a fixed dependency on a parent bean definition.
一个 ChildBeanDefinition 需要依赖一个 RootBeanDefinition,它表示这个 BeanDefinition 可以继承他的父类设置
GenericBeanDefinition
这个 BeanDefinition 同样继承了 AbstractBeanDefinition。
GenericBeanDefinition is a one-stop shop for standard bean definition purposes.
它用来表示一个普通的 Bean,没特别的作用。
AnnotatedGenericBeanDefinition
这个 BeanDefinition 继承了 GenericBeanDefinition。
Extension of the GenericBeanDefinition class, adding support for annotation metadata exposed
它只是在 GenericBeanDefinition 基础上添加了对注解的支持。通过它可以很方便的获得 BeanDefinition 上的注解信息。
ScannedGenericBeanDefinition
这个 BeanDefinition 同样继承了 GenericBeanDefinition。
Extension of the GenericBeanDefinition class, based on an ASM ClassReader, with support for annotation metadata exposed
它比 AnnotatedGenericBeanDefinition 多了个用于 ASM 技术类解析的支持。