Spring中的BeanDefinition系列(三)—— BeanDefinition实现类

前言

在 Spring中的BeanDefinition系列(二)中,我们讲解了AbstractBeanDefinition,AbstractBeanDefinition是BeanDefinition实现类的公用代码部分,那么这一节我们就来讲解 BeanDefinition各个重点实现类。

BeanDefinition重点实现类有哪些

  • RootBeanDefinition– 不能设置parent bean定义

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

  • GenericBeanDefinition– 可以动态设置parent bean定义,也可以不设置parent bean定义

  • mergedBeanDefinition(mdb),一个非常特殊的对象,它不是一个实现类,是RootBeanDefinition的一个对象,这个对象在Spring扮演了非常重要的角色。其实它就是将所有的BeanDefinition最后都装饰成一个RootBeanDefinition对象(mergedBeanDefinition),这个对象继承了双亲Bean的属性(如果有双亲的话)

如果你还没有使用过这几个实现类,建议你点击下面的链接进行学习:
Spring的bean定义 3 : BeanDefinition实现类例子演示

RootBeanDefinition源码

属性(除去AbstractBeanDefinition以外的属性,parentName一定为null):

属性 作用
decoratedDefinition A target definition that is being decorated by this bean definition.
装饰器模式。真正的被装饰的BeanDefinition。
qualifiedElement To be used instead of the target class or factory method,if any.
Otherwise, the factory method and target class will be checked.
beforeInstantiationResolved Package-visible field that indicates a before-instantiation post-processor having kicked in
targetType The target type of this bean definition, if known in advance.
resolvedTargetType Package-visible field for caching the determined Class of a given bean definition
factoryMethodReturnType Package-visible field for caching the return type of a generically typed factory method
constructorArgumentLock Common lock for the four constructor fields below
resolvedConstructorOrFactoryMethod Package-visible field for caching the resolved constructor or factory method
constructorArgumentsResolved Package-visible field that marks the constructor arguments as resolved
resolvedConstructorArguments Package-visible field for caching fully resolved constructor arguments
preparedConstructorArguments Package-visible field for caching partly prepared constructor arguments
postProcessingLock Common lock for the two post-processing fields below
postProcessed Package-visible field that indicates MergedBeanDefinitionPostProcessor having been applied
isFactoryMethodUnique A factory method name is a non-overloaded method.
externallyManagedConfigMembers 如其名
externallyManagedInitMethods 如其名
externallyManagedDestroyMethods 如其名

方法(除去get和set的方法)

方法 作用或代码
isFactoryMethod(Method candidate) return (candidate != null && candidate.getName().equals(getFactoryMethodName()));
getResolvedFactoryMethod() synchronized (this.constructorArgumentLock) { Object candidate = this.resolvedConstructorOrFactoryMethod; return (candidate instanceof Method ? (Method) candidate : null);}
registerExternallyManagedConfigMember(Member configMember) 如其名
isExternallyManagedConfigMember(Member configMember) 如其名
registerExternallyManagedInitMethod(String initMethod) 如其名
isExternallyManagedInitMethod(String initMethod) 如其名
registerExternallyManagedDestroyMethod(String destroyMethod) 如其名
isExternallyManagedDestroyMethod(String destroyMethod) 如其名

ChildBeanDefinition源码

属性(除去AbstractBeanDefinition以外的属性,parentName一定不为null):

无其他属性。

方法除去AbstractBeanDefinition以外的方法):

无其它方法。


GenericBeanDefinition源码

属性(除去AbstractBeanDefinition以外的属性,parentName一定可以为null,也可以不为null):

无其他属性。

方法除去AbstractBeanDefinition以外的方法):

无其它方法。


小结

从上面的分析可以看到,RootBeanDefinition的parentName一定为null而ChildBeanDefinition的parentName一定不为null而GenericBeanDefinition的parentName可以为null,也可以不为null。因此,我们能够很明确的看到它们的作用。

我们还从上面的源码中看到,RootBeanDefinition中的属性极为丰富,为什么这样做呢,是因为在bean生成的过程中会将所有的BeanDefinition都解析为RootBeanDefinition(被称为mdb,即mergedBeanDefinition,因为它合并了所有属性,因为RootBeanDefinition有所有的属性,因此mdb的类型为RootBeanDefinition),然后再生成bean。分析见Spring的bean定义 4 : 合并了的bean定义–MergedBeanDefinition。

参考链接

  • Spring的bean定义 3 : BeanDefinition实现类例子演示
  • Spring的bean定义 4 : 合并了的bean定义–MergedBeanDefinition。

你可能感兴趣的:(JAVA其他)