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;

	表明before-instantiation post-processor(可能是BeanPostProcessor的实现类)是否已经启动
	/** 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
	private Set<String> externallyManagedInitMethods;

	@Nullable
	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需要的信息基本完善

猜你喜欢

转载自blog.csdn.net/dhaiuda/article/details/83278406