本节主要介绍beanDefintion体系结构、关键参数解析以及beanDefintion在整个框架中作用。总所周知, spring里面的实例对象都以bean的形式存在,每个bean对象的实例化都是以beanDefinition为基础,通过反射获得构造函数,通过调用构造函数得到对应实例。为什么需要beanDefintion,而不是直接通过类class直接生成bean?下面即将揭晓答案。
#1、beanDefinition体系结构
其中绿虚线代表接口实现,绿实线代表接口继承,蓝实线代表类继承;可以看到不管是注解类型(AnnotatedBeanDefinition)和非注解类型(AbstractBeanDefinition)都实现或者继承BeanDefinition。BeanDefinition分别继承两个接口AttributeAccessor(bean属性的访问控制)和BeanMetadataElement(获取该bean的源配置的接口);
#2、beanDefinition
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
//当前beanDefinition的父beanDefinition名字
void setParentName(@Nullable String parentName);
@Nullable
String getParentName();
//当前bean的类名
void setBeanClassName(@Nullable String beanClassName);
@Nullable
String getBeanClassName();
//bean的作用域,常见的有singleton和prototype;
void setScope(@Nullable String scope);
@Nullable
String getScope();
//当前bean是否懒加载;如果为懒加载,在获取此bean时才进行实例化;
void setLazyInit(boolean lazyInit);
boolean isLazyInit();
//当前bean所依赖的bean。如果有依赖bean,锁依赖bean必须早于当前bean生成;
void setDependsOn(@Nullable String... dependsOn);
@Nullable
String[] getDependsOn();
//当前bean是否作为候选bean作为其他bean的依赖
void setAutowireCandidate(boolean autowireCandidate);
boolean isAutowireCandidate();
//多个bean都可以作为依赖注入到其他bean时,标注为primary的bean被注入
void setPrimary(boolean primary);
boolean isPrimary();
void setFactoryBeanName(@Nullable String factoryBeanName);
@Nullable
String getFactoryBeanName();
void setFactoryMethodName(@Nullable String factoryMethodName);
@Nullable
String getFactoryMethodName();
ConstructorArgumentValues getConstructorArgumentValues();
default boolean hasConstructorArgumentValues() {
return !getConstructorArgumentValues().isEmpty();
}
MutablePropertyValues getPropertyValues();
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在容器中的角色,主要有:
int ROLE_APPLICATION = 0;
int ROLE_SUPPORT = 1;
int ROLE_INFRASTRUCTURE = 2;*/
void setRole(int role);
int getRole();
void setDescription(@Nullable String description);
@Nullable
String getDescription();
boolean isSingleton();
boolean isPrototype();
boolean isAbstract();
@Nullable
String getResourceDescription();
@Nullable
BeanDefinition getOriginatingBeanDefinition();
}
#3、beanDefinition的作用
为什么不直接通过该类的信息直接进行实例化,而是通过class先生成beanDefinition,再通过beanDefinition生成具体bean?
A、 统一模型:无论是spring框架的基础类还是应用程序类都转化成BeanDefinition(用beanDefinition描述class信息),无论是xml配置的bean还是注解配置的bean,都统一转化成用beanDefinition表示,达到统一模型的作用;
B、针对原型bean,可以加快bean的生成速度;
可以看到配置成希望被spring管理的class都解析成BeanDefinition存入beanDefinitionMap,供后续实例化bean使用,beanDefinition起着承上启下的作用。