本节主要介绍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起着承上启下的作用。