详解SpringIOC BeanDeifition
BeanDefiton是什么?
BeanDefition是Spring对POJO的抽象,通过BeanDefition来更好地创建、管理Bean。
| 定义 | 含义 |
|---|---|
| beanClassName | bean的类名。该属性并不总是对应着bean真正使用的类的名称。bean通过某个类的静态工厂方法生成,那么这beanClassName就是该类;bean通过工厂Bean生成,那么这里为null |
| scope | 作用域singleton或者prototype |
| lazyInit | 是否懒加载BeanFacotry中的Bean默认懒加载,ApplicationContext在初始化阶段就会实例化 |
| dependsOn | 所依赖的bean的名称在抽象类AbstractBeanFacotry中dependsOn是一个String数组,保证这些被依赖的bean优先被实例化。 |
| factoryBeanName | 如果使用factoryBean来创建bean,这里指定了相应的工厂bean的类名称 |
| facotryMethodName | 工厂方法名称,基于类的静态工厂方法的情况下,结合beanClassName使用,基于工厂bean的情况下,结合facotryBeanName使用,如果bean定义下的constructArugmentValues有内容,工厂方法会在被调用时使用该属性 |
| role | bean的角色:APPLICATION,SUPPORT,INFRASTRUCTURE。提示框架该bean的角色和重要程度。 |
AbstractBeanDefition
AbstractBeanDefition是对BeanDefition的补充,定义了一些公共配置和公共能力,不加以赘述。
全功能的BeanDefiton
RootBeanDefinition
不能设置parentbean定义,他本身就是根
ChildBeanDefinition
必须设置parentbean定义,而且必须通过构造函数指定
GenricBeanDefinition
动态设置parentbean,也可以不设置parentbeand相对更加灵活
MergedBeanDefinition
笔者在阅读Spring源码时,注意到MergedBeanDefinition和getMergedLocalBeanDefinition方法,而MergedBeanDefition只是Spring中一个抽象的BeanDefition概念,其本质上是一个RootBeanDefinition。
MergedBeanDefinition从中文上理解是合并的bean,上文提到BeanDefition中规范了parentbean,Spring会检查bean对应的BeanDefitione,智能合并bean与parentbean。
通过getMergedLocalBeanDefinition方法摘要,加深一下理解。
synchronized(this.mergedBeanDefinitions){
//mbd->mergedBeanDefinition
RootBeanDefinitionmbd=null;
RootBeanDefinitionprevious=null;
if(mbd==null||mbd.stale){
previous=mbd;
/**bd.getParentName()==null代表着
该beanDefition是一个RootBeanDefition
或者该beanDefition是一个没有parentBean的GenricBeanDefition
**/
if(bd.getParentName()==null){
if(bdinstanceofRootBeanDefinition){
mbd=((RootBeanDefinition)bd).cloneBeanDefinition();
}
else{
mbd=newRootBeanDefinition(bd);
}
}
/**该beanDefition是一个ChildBeanDefition**/
else{
BeanDefinitionpbd;
StringparentBeanName=transformedBeanName(bd.getParentName());
if(!beanName.equals(parentBeanName)){
pbd=getMergedBeanDefinition(parentBeanName);
}
else{
BeanFactoryparent=getParentBeanFactory();
if(parentinstanceofConfigurableBeanFactory){
/递归式调用/
pbd=((ConfigurableBeanFactory)parent).getMergedBeanDefinition(parentBeanName);
}
mbd=newRootBeanDefinition(pbd);
mbd.overrideFrom(bd);
}
}
returnmbd;
}
以上就是详解SpringIOCBeanDeifition的详细内容,更多关于SpringIOCBeanDeifition的资料请关注毛票票其它相关文章!