《spring设计思想》6 beanDefinition的加载实现

上面第四节讲到了spring的DI/look up的数据来源,这次分析一下spring中的beanDefinition是怎么加载到beanFactory中的。

想一想我们在平时的工作中加载spring beanDefinition的几个来源

1:xml配置文件

2:properties文件

3:注解标注

那么针对三个不同的来源,会使用不同的手段加载到spring容器中。相当于spring设计一个接口,根据不同的规则实现特殊的类。

spring设计的接口就是BeanDefinitionReader

简单的看一下BeanDefinitionReader接口的方法

《spring设计思想》6 beanDefinition的加载实现

接口定义了loadBeanDefinitions方法,入参是Resource或者String,代表beanDefinitions配置资源,

具体的实现类:

《spring设计思想》6 beanDefinition的加载实现

具体有三个,GroovyBeanDefinitionReader / PropertiesBeanDefinitionReader /XmlBeanDefinitionReader。从名字上就能看出主要是解析什么养的BeanDefinitions的配置资源。一般环境中会用到PropertiesBeanDefinitionReader 和 XmlBeanDefinitionReader

但是没有看到解析注解的beanDefinitionReader;原因是,AnnotatedBeanDefinitionReader没有实现BeanDefinitionReader接口,因为AnnotatedBeanDefinitionReader没有必要解析Spring的Resource类型,只要扫描jar包的class文件就可以了。

所以Spring 中委托XmlBeanDefinitionReader/PropertiesBeanDefinitionReader/AnnotatedBeanDefinitionReader来解析beanDefintion,加载到spring容器中。其实这个容器很简单

接口名称BeanDefinitionRegistry

《spring设计思想》6 beanDefinition的加载实现

主要的方法就是registerBeanDefinition。

而Spring中的默认实现是DefaultListableBeanFactory

这个类非常的有意思因为在AbstractRefreshableApplication中包含了DefaultListableBeanFactory对象。

ClassPathXmlApplicationContext

XmlWebApplicationContext

AnnotationConfigWebApplicationContext都继承了该类。