《spring设计思想》6 beanDefinition的加载实现
上面第四节讲到了spring的DI/look up的数据来源,这次分析一下spring中的beanDefinition是怎么加载到beanFactory中的。
想一想我们在平时的工作中加载spring beanDefinition的几个来源
1:xml配置文件
2:properties文件
3:注解标注
那么针对三个不同的来源,会使用不同的手段加载到spring容器中。相当于spring设计一个接口,根据不同的规则实现特殊的类。
spring设计的接口就是BeanDefinitionReader
简单的看一下BeanDefinitionReader接口的方法
接口定义了loadBeanDefinitions方法,入参是Resource或者String,代表beanDefinitions配置资源,
具体的实现类:
具体有三个,GroovyBeanDefinitionReader / PropertiesBeanDefinitionReader /XmlBeanDefinitionReader。从名字上就能看出主要是解析什么养的BeanDefinitions的配置资源。一般环境中会用到PropertiesBeanDefinitionReader 和 XmlBeanDefinitionReader
但是没有看到解析注解的beanDefinitionReader;原因是,AnnotatedBeanDefinitionReader没有实现BeanDefinitionReader接口,因为AnnotatedBeanDefinitionReader没有必要解析Spring的Resource类型,只要扫描jar包的class文件就可以了。
所以Spring 中委托XmlBeanDefinitionReader/PropertiesBeanDefinitionReader/AnnotatedBeanDefinitionReader来解析beanDefintion,加载到spring容器中。其实这个容器很简单
接口名称BeanDefinitionRegistry
主要的方法就是registerBeanDefinition。
而Spring中的默认实现是DefaultListableBeanFactory。
这个类非常的有意思因为在AbstractRefreshableApplication中包含了DefaultListableBeanFactory对象。
ClassPathXmlApplicationContext
XmlWebApplicationContext
AnnotationConfigWebApplicationContext都继承了该类。