详解SpringIOC BeanDeifition

网友投稿 614 2023-02-28

详解SpringIOC BeanDeifition

详解SpringIOC BeanDeifition

BeanDefiton是什么?

BeanDefition是Spring对POJO的抽象,通过BeanDefition来更好地创建、管理Bean。

定义

含义

beanClassName

bean的类名。该属性并不总是对应着bean真正使用的类的名称。bean通过某个类的静态工厂方法生成,那么这beanClassName就是该类;bean通过工厂Bean生成,那么这里为null

scope

作用域 singleton 或者 prototype

lazyInit

是否懒加载 BeanFacotry中的Bean默认懒加载,APPlicationCohttp://ntext在初始化阶段就会实例

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

必须设置parent bean定义,而且必须通过构造函数指定

GenricBeanDefinition

动态设置parent bean,也可以不设置parent beand 相对更加灵活

MergedBeanDefinition

笔者在阅读Spring源码时,注意到MergedBeanDefinition和getMergedLocalBeanDefinition方法,而MergedBeanDefition只是Spring中一个抽象的BeanDefition概念,其本质上是一个RootBeanDefinition。

MergedBeanDefinition从中文上理解是合并的bean,上文提到BeanDefition中规范了parentbean,Spring会检查bean对应的BeanDefitione,智能合并bean与parentbean。

通过getMergedLocalBeanDefinition方法摘要,加深一下理解。

synchronized (this.mergedBeanDefinitions) {

//mbd->mergedBeanDefinition

RootBeanDefinition mbd = null;

RootBeanDefinition previous = null;

if (mbd == null || mbd.stale) {

previous = mbd;

/** bd.getParentName() == null 代表着

该beanDefition是一个RootBeanDefition

或者该beanDefition是一个没有parentBean的GenricBeanDefition

**/

if (bd.getParentName() == null) {

if (bd instanceof RootBeanDefinition) {

mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();

}

else {

mbd = new RootBeanDefinition(bd);

}

}

/**该beanDefition是一个ChildBeanDefition**/

else {

BeanDefinition pbd;

String parentBeanName = transformedBeanName(bd.getParentName());

if (!beanName.equals(parentBeanName)) {

pbd = getMergedBeanDefinition(parentBeanName);

}

else {

BeanFactory parent = getParentBeanFactory();

if (parent instanceof ConfigurableBeanFactory) {

/递归式调用/

pbd = ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName);

}

mbd = new RootBeanDefinition(pbd);

mbd.overrideFrom(bd);

}

}

return mbd;

}

以上就是详解SpringIOC BeanDeifition的详细内容,更多关于SpringIOC BeanDeifition的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于在IDEA热部署插件JRebel使用问题详解
下一篇:h5跳转到小程序(h5跳转到小程序直播间)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~