文章目录

  • 1. 作用
  • 2. 源码
  • 3. UML图


1. 作用

BeanDefinition是Spring IOC核心之一;Spring对通过xml配置文件解析出的,或者注解扫描出的Bean进行加载,然后对每一个Bean都生成一个BeanDefinition对象,通过这个对象可以获取Bean的角色、类属性、作用域、延迟加载等等信息,用于IOC实例该Bean的对象时使用;

在Spring中BeanDefinition是一个接口,定义了它该有的行为,如下:



2. 源码

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
	
	// 常量: 单例
	String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
	
	// 常量: 原型
	String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
	
	// 常量: 应用程序角色
	int ROLE_APPLICATION = 0;
	
    // 常量: 外部较大配置部分支持角色(不知道有什么用)
	int ROLE_SUPPORT = 1;
	
	// 常量: 基础框架角色
	int ROLE_INFRASTRUCTURE = 2;
	
	void setParentName(@Nullable String parentName);
	
    // 父BeanDefinition名称
	@Nullable
	String getParentName();
	
	void setBeanClassName(@Nullable String beanClassName);
	
	// 核心属性: Bean的ClassName
	@Nullable
	String getBeanClassName();
	
	void setScope(@Nullable String scope);
	
	// 核心属性: Bean的作用域
	@Nullable
	String getScope();
	
	void setLazyInit(boolean lazyInit);
	
	//核心属性: Bean的延迟加载
	boolean isLazyInit();
	
	void setDependsOn(@Nullable String... dependsOn);
	
	// 该Bean实例化前需要依赖的Bean名称集合
	@Nullable
	String[] getDependsOn();
	
	void setAutowireCandidate(boolean autowireCandidate);
	
	// 该Bean是否有资格自动注入其他Bean实例
	boolean isAutowireCandidate();
	
	void setPrimary(boolean primary);
	
	// 该Bean是否是自动注入其他Bean实例的头号选手
	boolean isPrimary();
	
	void setFactoryBeanName(@Nullable String factoryBeanName);
	
    // 该Bean的工厂Bean名称
	@Nullable
	String getFactoryBeanName();
	
	void setFactoryMethodName(@Nullable String factoryMethodName);
	
    // 该Bean的工厂方法
	@Nullable
	String getFactoryMethodName();
	
	// 该Bean的constructor-arg标签定义的参数
	ConstructorArgumentValues getConstructorArgumentValues();
	
	default boolean hasConstructorArgumentValues() {
		return !getConstructorArgumentValues().isEmpty();
	}
	
	// 该Bean的property标签定义的属性
	MutablePropertyValues getPropertyValues();
	
	default boolean hasPropertyValues() {
		return !getPropertyValues().isEmpty();
	}
	
	void setInitMethodName(@Nullable String initMethodName);
	
	// 该Bean的初始化方法名称
	@Nullable
	String getInitMethodName();
	
	void setDestroyMethodName(@Nullable String destroyMethodName);
	
	// 该Bean的销毁方法名称
	@Nullable
	String getDestroyMethodName();
	
	void setRole(int role);
	
    // 该Bean的角色
	int getRole();
	
	void setDescription(@Nullable String description);
	
    // 该Bean的描述
	@Nullable
	String getDescription();
	
	// Read-only attributes
	// 以下为只读属性
	ResolvableType getResolvableType();
	
	boolean isSingleton();
	
	boolean isPrototype();
	
	boolean isAbstract();
	
	@Nullable
	String getResourceDescription();
	
	@Nullable
	BeanDefinition getOriginatingBeanDefinition();
	
}



3. UML图

spring bean转换映射 spring beandefine_java

类说明:

  1. AbstractBeanDefinitionBeanDefinition中的大部分方法都进行了实现,除了setParentName()和getParentName()两个接口,同时它自身还新增了一个cloneBeanDefinition抽象方法需要子类实现;
  2. AbstractBeanDefinition继承了BeanMetadataAttributeAccessor类(Bean元数据和属性访问器),正好BeanMetadataAttributeAccessor类对BeanDefinition继承的AttributeAccessorBeanMetadataElement两个接口进行了实现;
  3. xml文件中配置的Bean被加载时是生成的GenericBeanDefinition类型,同时被注册到DefaultListableBeanFactorybeanDefinitionMap属性中,然后首次获取该BeanDefinition时被转换成RootBeanDefinition类型,同时被注册到AbstractBeanFactorymergedBeanDefinitions属性中;
  4. 通过注解扫描出的Bean被加载时是生成的ScannedGenericBeanDefinition类型,剩下逻辑与上面相同;
  5. @Configuration注解修饰的类被加载时是生成的AnnotatedGenericBeanDefinition类型,剩下逻辑与上面相同;
  6. ScannedGenericBeanDefinitionAnnotatedGenericBeanDefinitionGenericBeanDefinition的区别是多了一个注解元数据属性;
  7. RootBeanDefinitionChildBeanDefinitionGenericBeanDefinition的区别:
  • RootBeanDefinition是作为根BeanDefinition,不允许有父BeanDefinition,其setParentName()方法在参数不为null时会抛出异常;
  • ChildBeanDefinition是作为子BeanDefinition,其所有构造函数都有一个parentName参数,当parentName属性为null时,调用validate()方法时会抛出异常;
  • GenericBeanDefinition是作为普通BeanDefinition,没有上面的限制;