spring源码阅读(5.1.0版本)——RootBeanDefinition

本文难免有错误,如有错误,欢迎指出

什么是RootBeanDefinition

注:从spring2.5开始,spring一开始都是使用GenericBeanDefinition类保存Bean的相关信息,在需要时,在将其转换为其他的BeanDefinition类型

  • 是运行时使用的Bean视图,即spring会使用RootBeanDefinition初始化Bean
  • 在源码注释中,有这么一句:It might have been created from multiple original bean definitions that inherit from each other,spring会依据多个具有继承关系的BeanDefinition(实际上是GenericBeanDefinition类型)来创建RootBeanDefinition,换句话说,在多继承体系中,RootBeanDefinition代表的是当前初始化类的父类的BeanDefinition
  • RootBeanDefinition可用于没有继承关系的Bean的创建

 

源码

RootBeanDefinition直接继承了AbstractBeanDefinition,关于AbstractBeanDefinition,可以参照之前写的博客:https://blog.csdn.net/dhaiuda/article/details/83210577

这里只讲解一下自己对于RootBeanDefinition的理解:
 

	BeanDefinitionHolder存储有Bean的名称、别名、BeanDefinition
	@Nullable
	private BeanDefinitionHolder decoratedDefinition;

    是java反射包的接口,通过它可以查看Bean的注解信息,具体方法请查看:https://blog.csdn.net/u010142437/article/details/51589939
	@Nullable
	private AnnotatedElement qualifiedElement;

	允许缓存
	boolean allowCaching = true;

	从字面上理解:工厂方法是否唯一
	boolean isFactoryMethodUnique = false;

	封装了java.lang.reflect.Type,提供了泛型相关的操作,具体请查看:
	https://blog.wangqi.love/articles/Spring/Spring%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B%E5%88%86%E6%9E%90.%E7%95%AA%E5%A4%96(ResolvableType).html
	@Nullable
	volatile ResolvableType targetType;

	缓存class,表明RootBeanDefinition存储哪个类的信息
	/** Package-visible field for caching the determined Class of a given bean definition. */
	@Nullable
	volatile Class<?> resolvedTargetType;

	缓存工厂方法的返回类型
	/** Package-visible field for caching the return type of a generically typed factory method. */
	@Nullable
	volatile ResolvableType factoryMethodReturnType;

	缓存工厂方法
	/** Package-visible field for caching a unique factory method candidate for introspection. */
	@Nullable
	volatile Method factoryMethodToIntrospect;

	以下四个变量的锁
	/** Common lock for the four constructor fields below. */
	final Object constructorArgumentLock = new Object();

	缓存已经解析的构造函数或是工厂方法,Executable是Method、Constructor类型的父类,关于java反射的更多信息请查看:
	https://www.cnblogs.com/guangshan/p/4888656.html
	/** Package-visible field for caching the resolved constructor or factory method. */
	@Nullable
	Executable resolvedConstructorOrFactoryMethod;

	表明构造函数参数是否解析完毕
	/** Package-visible field that marks the constructor arguments as resolved. */
	boolean constructorArgumentsResolved = false;

	缓存完全解析的构造函数参数
	/** Package-visible field for caching fully resolved constructor arguments. */
	@Nullable
	Object[] resolvedConstructorArguments;

	缓存待解析的构造函数参数,即还没有找到对应的实例,可以理解为还没有注入依赖的形参(我的理解)
	/** Package-visible field for caching partly prepared constructor arguments. */
	@Nullable
	Object[] preparedConstructorArguments;

	以下两个变量的锁
	/** Common lock for the two post-processing fields below. */
	final Object postProcessingLock = new Object();

	表明是否被MergedBeanDefinitionPostProcessor处理过
	/** Package-visible field that indicates MergedBeanDefinitionPostProcessor having been applied. */
	boolean postProcessed = false;

	在生成代理的时候会使用,表明是否已经生成代理
	/** Package-visible field that indicates a before-instantiation post-processor having kicked in. */
	@Nullable
	volatile Boolean beforeInstantiationResolved;

    以下三个属性是外部管理的方法集合(配置、初始化、銷毀),似乎可以缓存自动装配对象的值

	实际缓存的类型是Constructor、Field、Method类型,更多信息请查看:http://shouce.jb51.net/java/jdk1.5/java/lang/reflect/class-use/Member.html
	@Nullable
	private Set<Member> externallyManagedConfigMembers;

	@Nullable
     InitializingBean中的init回调函数名——afterPropertiesSet会在这里记录,以便进行生命周期回调
	private Set<String> externallyManagedInitMethods;

	@Nullable
     DisposableBean的destroy回调函数名——destroy会在这里记录,以便进行生命周期回调
	private Set<String> externallyManagedDestroyMethods;

总结一下,RootBeanDefiniiton保存了以下信息

  1. 定义了id、别名与Bean的对应关系(BeanDefinitionHolder)
  2. Bean的注解(AnnotatedElement)
  3. 具体的工厂方法(Class类型),包括工厂方法的返回类型,工厂方法的Method对象
  4. 构造函数、构造函数形参类型
  5. Bean的class对象

可以看到许多与反射相关的对象,这说明spring底层采用的是反射机制,我们把RootBeanDefinition的属性与AbstractBeanDefinition进行对比:

可以看到,RootBeanDefinition与AbstractBeanDefinition是互补关系,RootBeanDefinition在AbstractBeanDefinition的基础上定义了更多属性,初始化Bean需要的信息基本完善

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值