栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

详解SpringIOC BeanDeifition

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解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

必须设置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;
      
			if (bd.getParentName() == null) {
					if (bd instanceof RootBeanDefinition) {
						mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();
					}
					else {
						mbd = new RootBeanDefinition(bd);
					}
			}
      
			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的资料请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/129857.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号