背景简介
出现的原因
我们之前介绍了 BeanDefinition
——定义了定义 bean 所需要的基本属性;AbstractBeanDefinition
——对 一个BD
通用的功能进行了集中实现;ChildBeanDefinition
——支持父BD
,但是是创建时写死,所以已经废弃,由GenericBeanDefinition
代替。
和上面的对应,我们本次介绍的是不支持父BD
的RootBeanDefinition
。他的主要通途是进行 Bean 实例创建时使用。
职责
经过之前的阅读,我们知道 BD
是可以分层级的,因为有ParentName
的getter/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;