一起学SF框架系列5.7-spring-Beans-BeanDefinition定义

在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解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐享技术

每一个打赏,都是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值