在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解析
![[kafka] windows下安装kafka(含安装包)](https://img-blog.csdnimg.cn/dd8daf51ea9947a5bb9f76522ee2ce83.png)


















