本文主要是介绍Spring源码阅读-BeanDefinition,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1概述
在阅读Spring源码的时候,发现Spring通过加载配置文件获得文档(document)对象之后,会对文档里面的标签进行解析注册到Spring容器中,如下图所示,通过资源文件获得文档对象之后,Spring会立马进行bean标签的解析和注入。
继续往下走,我们会看到,Spring对Bean标签的解析会分为默认标签解析和自定义标签解析,两者的区别,后续我会再写一篇文章说明。
2 BeanDefinition
在Spring解析Bean标签的过程中,可以发现,会经常出现BeanDefintion这个字眼,通过查阅源码,可以知道,BeanDefinition其实是一个接口,在Spring框架中,总共有三种实现,分别是RootBeanDefinition,ChildBeanDefinitio和GenericDefinition。三者均继承AbstractBeanDefinition抽象类,BeanDefinition的三个实现及相关关系如图所示。
BeanDefinition是配置文件<bean>
标签在容器的内部表示形式,<bean>
元素拥有class,scope,lazy-init等配置属性,BeanDefinition则提供了相应的beanClass,scope,lazyinit属性,BeanDefinition和<bean>
标签总的属性是一一对应的,在BeanDefinition的三个实现中,RootBeanDefinition 是最常见的实现类,与其对应的是一般性的<bean>
标签,GenericBeanDefinition 是从2.5版本以后新加入的bean文件配置属性定义类,一站式服务类。
在配置文件中,可以定义父bean
和子bean
,父bean
用 RootBeanDefinition表示,而子bean
用哦过ChildBeanDefinition表示。其它情况一般用GenericBeanDefinition 即可。在bean
标签的解析中,Spring 通过将配置文件中的bean
标签的配置信息转为BeanDefinition注册到BeanDefinitionRegisty中,BeanDefinitionRegisty好比Spring配置信息的内存数据库,主要是以map形式存在。在bean
解析完毕的时候,后续操作都是直接从BeanDefinitionRegisty中读取配置信息.
本质来说,BeanDefinition是bean属性的一种承载实体。
3.BeanDefinition 的父关系
BeanDefinition 继承 AttributeAccessor 和 BeanMetadataElement 接口。
AttributeAccessor接口定义了对属性的修改,包括获取、设置、删除。
BeanMetadataElement,Bean 元对象持有的配置元素可以通过 #getSource() 方法来获取。代码如下
这篇关于Spring源码阅读-BeanDefinition的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!