上面第四節講到了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都繼承了該類。