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