在SF下,开发人员用xml或注解模式定义bean,框架把这些定义转化为内部BeanDefinition类,然后通过BeanDefinition类实现Bean的管理(包括初始化、依赖注入及生命周期管理),因此了解Bean的定义、解析、使用过程非常有主力理解框架。
框架BeanDefinition
类关系图
AttributeAccessorSupport:实现AttributeAccessor
BeanMetadataAttributeAccessor:实现BeanMetadataElement
AbstractBeanDefinition:实现BeanDefinition
RootBeanDefinition:RootBeanDefinition继承于AbstractBeanDefinition,是一个bean的完整定义。它可能是由多个相互继承的原始bean合并定义创建的。它是BeanFactory中在初始化过程中组装并真正使用的BeanDefinition。由于是合并bean,因此不存在父bean,不能定义parent。
GenericBeanDefinition:继承AbstractBeanDefinition,主要是增加动态设置parent bean定义,也可以不设置parent bean定义
ChildBeanDefinition:继承于AbstractBeanDefinition,但必须设置parent bean定义,而且必须是通过构造函数指定。
AnnotatedGenericBeanDefinition:继承于GenericBeanDefinition,增加注解元数据操作(设置或获取)。
BeanDefiniton
BeanDefinition定义了一个bean实例描述,包括bean具有属性值、构造函数参数值以及由具体实现提供的进一步信息。
//BeanDefinition继承了AttributeAccessor和BeanMetadataElement ,AttributeAccessor 定义了属性操作;BeanMetadataElement 返回元数据配置源对象(可能为null)
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
//单实例bean关键字
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
//多实例bean关键字
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
//用户定义bean标识关键字
int ROLE_APPLICATION = 0;
//部分bean定义标识关键字
int ROLE_SUPPORT = 1;
//SF内部使用的bean标识关键字
int ROLE_INFRASTRUCTURE = 2;
//父bean名操作
void setParentName(@Nullable String parentName);
@Nullable
String getParentName();
//bean对应Class名作
void setBeanClassName(@Nullable String beanClassName);
@Nullable
String getBeanClassName();
//bean范围操作(SCOPE_SINGLETON或SCOPE_PROTOTYPE)
void setScope(@Nullable String scope);
@Nullable
String getScope();
//bean延迟加载标志操作
void setLazyInit(boolean lazyInit);
boolean isLazyInit();
//bean依赖其它bean名(String[])
void setDependsOn(@Nullable String... dependsOn);
@Nullable
String[] getDependsOn();
//bean是否是autowire候选者
void setAutowireCandidate(boolean autowireCandidate);
boolean isAutowireCandidate();
//bean是否是优先的autowire候选者(当有多个同类的候选者的情况)
void setPrimary(boolean primary);
boolean isPrimary();
//是FactoryBean产生的bean,设置FactoryBeanName
void setFactoryBeanName(@Nullable String factoryBeanName);
@Nullable
String getFactoryBeanName();
//指定工厂方法名(如果有)。此方法将使用构造函数参数调用,如果未指定任何参数,则不使用任何参数调用。该方法将在指定的工厂bean上调用(如果有的话),或者作为本地bean类上的静态方法调用
void setFactoryMethodName(@Nullable String factoryMethodName);
@Nullable
String getFactoryMethodName();
//获取构建函数参数
ConstructorArgumentValues getConstructorArgumentValues();
//构建函数是否有参数
default boolean hasConstructorArgumentValues() {
return !getConstructorArgumentValues().isEmpty();
}
//bean实例化后的所有属性值(在初始化过程中可被修改)
MutablePropertyValues getPropertyValues();
//bean实例化后的属性是否有值
default boolean hasPropertyValues() {
return !getPropertyValues().isEmpty();
}
//bean的初始化方法名操作
void setInitMethodName(@Nullable String initMethodName);
@Nullable
String getInitMethodName();
//bean销毁方法名操作
void setDestroyMethodName(@Nullable String destroyMethodName);
@Nullable
String getDestroyMethodName();
//bean角色操作(ROLE_APPLICATION |ROLE_SUPPORT |ROLE_INFRASTRUCTURE )
void setRole(int role);
int getRole();
//bean的注释操作
void setDescription(@Nullable String description);
@Nullable
String getDescription();
// Read-only attributes
//bean的解析类型(bean class或者特定元数据)
ResolvableType getResolvableType();
//是否单实例bean(SCOPE_SINGLETON)
boolean isSingleton();
//是否多实例bean(SCOPE_PROTOTYPE)
boolean isPrototype();
//是抽象类
boolean isAbstract();
//获取bean的资源描述,一般用于有错误时显示上下文
@Nullable
String getResourceDescription();
//获取bean的原始定义(框架使用过程中可能进行了增强装饰)
@Nullable
BeanDefinition getOriginatingBeanDefinition();
}
AnnotatedBeanDefinition
扩展BeanDefinition的注解模式。
public interface AnnotatedBeanDefinition extends BeanDefinition {
// 获取bean的注解元数据
AnnotationMetadata getMetadata();
// 获取定义该bean的工厂方法上的元数据
@Nullable
MethodMetadata getFactoryMethodMetadata();
}
应用定义Bean
开发人员按照bean的元数据规则定义应用bean,SF通过解析生成框架使用的BeanDefinition。
开发人员如何定义Bean,参见:一起学SF框架系列5.2-模块Beans-bean的元数据配置
bean配置好了,如何解析成BeanDefinition参见:一起学SF框架系列5.7-模块Beans-BeanDefinition解析