1、BeanDefinition简介
- BeanDefiniton是一个接口,继承自AttributeAccessor和BeanMetadataElement两个接口,这两个接口主要是为了“访问对象相关属性”和“获取元数据相关信息”。BeanDefinition的主要定义对象就是Bean,对bean在整个Spring 容器框架中的基本数据结构进行定义,方便BeanFactory等获取。
- Spring框架,众多的Bean的定义分为两种形式,一种通过XML,或者通过注解。当我们代码定义完整的Bean后,Ioc启动过程中,就得对相关的xml schema进行解析或相关注解下类进行扫描,从将我们配置的Bean转换为Spring内部表示的数据结构。
2、BeanDefinition注册过程
- 由于BeanDefinition的数据来源是我们定义的xml相关的Bean,所以自然BeanDefinition的注册过程就是对于xml的解析过程以及对相关元素赋值的过程,在Spring框架中解析<Bean>元素过程中不是创建和实例化Bean对象,而是通过创建BeanDefinition对象,并将<Bean>元素的相关配置信息填充到BeanDefinition中作为记录,当依赖注入时才使用这些记录的相关信息通过BeanFactory进行实例化具体的Bean对象(就是先下个定义,需要时在使用),众多的BeanDefinition可通过BeanDefinitionHolder集中管理。
- Spring提供了主要两种bean Definition解析器,都继承自AbstractBeanDefinitionReader
- GroovyBeanDefinitionReader
Groovy是一门基于JVM的动态语言,和Spring结合拥有强大的功能,主要可以用在Bean的动态加载,无需重启系统即可实现Bean的加载,特别是Spring cloud zuul中Zuul的规则引擎允许通过任何JVM语言来编写规则和过滤器, 支持基于Java和Groovy的构建。
- PropertiesBeanDefinitionReader
一种支持简单的属性文件的解析器,对于Map/Properties定义的格式属性文件或者ResourceBundle进行注册,主要是在DefaultListableBeanFactory进行运用。
- XmlBeanDefinitionReader
一种支持Xml文件的解析器,主要是在DefaultListableBeanFactory和GenericApplicationContext这两个BeanFactory中使用,以及获取Xml中定义的相关Bean的信息。
【PropertiesBeanDefinitionReader和XmlBeanDefinitionReander中的都存在方法registerBeanDefinition方法,这个方法核心作用都是将定义的bean注册到factory】
3、Bean工厂获取BeanDefinition
- BeanDefinitionRegistry(向注册表中注册 BeanDefinition 实例,完成 注册的过程。)
- DefaultListableBeanFactory是一个实际意义上的可以独立使用的IOC容器,其是继承接口BeanFactory和BeanDefinitionRegistry两个核心接口,其主要应用就是注册所有的definition或者获取相应的definition。
- GenericApplicationContext和DefaultListableBeanFactory类似也是继承了两个顶级接口BeanFactory和BeanDefinitionRegistry,同时还集成了ResourceLoader接口进行资源获取
4、涉及到设计模式
代码中AbstractBeanDefinitionReader的三个集成类中通过xml、动态加载获取、参数配置文件等方式来获取解析Bean,这里运用了外观模式,通过一个接口,将内部复杂的实现隐藏,对外客户端暴露简单的接口,实现了解耦。