5-RootBeanDefinition

背景简介

出现的原因

我们之前介绍了 BeanDefinition——定义了定义 bean 所需要的基本属性;AbstractBeanDefinition——对 一个BD通用的功能进行了集中实现;ChildBeanDefinition——支持父BD,但是是创建时写死,所以已经废弃,由GenericBeanDefinition代替。

和上面的对应,我们本次介绍的是不支持父BDRootBeanDefinition。他的主要通途是进行 Bean 实例创建时使用。

职责

经过之前的阅读,我们知道 BD 是可以分层级的,因为有ParentNamegetter/setter。这个在进行 BD 的配置时更加灵活,也可以进行配置的复用;但是在 Bean 实例构建时就很难受了,我构建一个 Bean 还有递归的去父类找配置。。。

所以我们想出了一个解决方法——在构建 Bean 实例时,先把 BD 拍平,这样所有的配置就都在一个BD中了。这就是RootBeanDefinition的主要使用场景,在这种场景下因为是拍平的,所以变量名一般叫 mergedBeanDefinition或者mbd

注意点

RootBeanDefinition中在AbstractBeanDefinition的基础上增加了很多的实例属性以方便使用。当然,两者各有侧重点:

  • AbstractBeanDefinition:是对通用功能的扩展,是为了兼顾 BD梳理和Bean实例化两个场景的。所以主要是一些属性的扩展和对属性的标记(标记捷径)
  • RootBeanDefinition:主要在 Bean 实例化时使用,为了方便实例化操作,提供了大量的缓存字段,方便重复实例化时减少工作量。

源码

/**
 * 在读/写和创建实例的方法有关的字段、缓存字段时使用此锁。
 */
final Object constructorArgumentLock = new Object();
/**
 * 在读/写后处理器相关缓存字段时使用此锁
 */
final Object postProcessingLock = new Object();

// 默认允许启用缓存
boolean allowCaching = true;

// 你的 FactoryMethod 有没有专门设置值【捷径方法】
boolean isFactoryMethodUnique = false;

@Nullable
// bean 中包含的范型 ??????【待定】
volatile ResolvableType targetType;

/**
 * 缓存之前确定好的 Bean 实例类型
 */
@Nullable
volatile Class<?> resolvedTargetType;

/**
 * 缓存之前确定好的创建实例的方法返回的类型
 */
@Nullable
volatile ResolvableType factoryMethodReturnType;
/**
 * 缓存之前确定好的创建实例的方法【可能是构造方法、可能是工厂方法】
 */
@Nullable
Executable resolvedConstructorOrFactoryMethod;
/**
 * 我们有没有缓存创建实例的入参【捷径方法】
 */
boolean constructorArgumentsResolved = false;
/**
 * 缓存之前确定好的创建实例的入参【可能是构造方法、可能是工厂方法】【这个是完整的一套入参】
 */
@Nullable
Object[] resolvedConstructorArguments;
/**
 * 缓存之前确定好的创建实例的入参【可能是构造方法、可能是工厂方法】【这个是不完整的一套入参,可能少东西】
 */
@Nullable
Object[] preparedConstructorArguments;
/**
 * 标记此 bd 是否被应用过后处理器的钩子【MergedBeanDefinitionPostProcessor】
 */
boolean postProcessed = false;
/**
 * 标记量,表明此 bd 是否要执行创造 bean 前的钩子【用于决定 aop 是否可以织入】
 */
@Nullable
volatile Boolean beforeInstantiationResolved;

/**
 * 待定
 **/
@Nullable
private BeanDefinitionHolder decoratedDefinition;

/**
 *待定
 **/
@Nullable
private AnnotatedElement qualifiedElement;

/**
 *待定
 **/
@Nullable
private Set<Member> externallyManagedConfigMembers;

/**
 *待定
 **/
@Nullable
private Set<String> externallyManagedInitMethods;

/**
 *待定
 **/
@Nullable
private Set<String> externallyManagedDestroyMethods;

待定内容

根据后面的Spring流程来判断字段的意思吧:

@Nullable
// bean 中包含的范型 ??????【待定】
volatile ResolvableType targetType;
/**
 * 待定
 **/
@Nullable
private BeanDefinitionHolder decoratedDefinition;

/**
 *待定
 **/
@Nullable
private AnnotatedElement qualifiedElement;

/**
 *待定
 **/
@Nullable
private Set<Member> externallyManagedConfigMembers;

/**
 *待定
 **/
@Nullable
private Set<String> externallyManagedInitMethods;

/**
 *待定
 **/
@Nullable
private Set<String> externallyManagedDestroyMethods;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容