SpringIOC中BeanDefinition详解如何实现?

2026-04-30 02:462阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计629个文字,预计阅读时间需要3分钟。

SpringIOC中BeanDefinition详解如何实现?

BeanDefinition是Spring对POJO的抽象,通过BeanDefinition来更好地创建和管理Bean。定义时包含beanClassName(bean的类名)和bean(类的名称)。该属性并不总是对应bean实际使用的类名。bean通过某个类来定义。

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定义,而且必须通过构造函数指定

SpringIOC中BeanDefinition详解如何实现?

GenricBeanDefinition

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

MergedBeanDefinition

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

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

通过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的资料请关注易盾网络其它相关文章!

本文共计629个文字,预计阅读时间需要3分钟。

SpringIOC中BeanDefinition详解如何实现?

BeanDefinition是Spring对POJO的抽象,通过BeanDefinition来更好地创建和管理Bean。定义时包含beanClassName(bean的类名)和bean(类的名称)。该属性并不总是对应bean实际使用的类名。bean通过某个类来定义。

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定义,而且必须通过构造函数指定

SpringIOC中BeanDefinition详解如何实现?

GenricBeanDefinition

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

MergedBeanDefinition

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

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

通过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的资料请关注易盾网络其它相关文章!