上一篇文章中,大致分析了,Spring BeanFactory的類結構圖,本篇文章分析如何解析配置文件和註冊Bean的配置
一、源碼切入點
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
重點在this.reader.loadBeanDefinitions(resource);
這裏,這裏不得不說一下,spring對很好的應用了對象的單一職責原則。
二、分析XmlBeanDefinitionReader
XmlBeanDefinitionReader UML圖
- BeanDefinitionReader:該接口主要是定義了2個重要方法,一個是getRegistry(); 因爲DefaultListableBeanFactory也實現了接口BeanDefinitionReader,所以其實這個方法就是持有bean factory,參考
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
這個構造方法,this就是beanfactory。 還有一個是loadBeanDefinitions():這個就是解析配置文件的,並且註冊bean定義 - AbstractBeanDefinitionReader:spring的老套路,先定義一個接口,然後讓一個抽象類實現該接口,進行默認實現,也可以理解接口的適配,這樣真正的實現類繼承該抽象類後,只需要實現重點功能就可。
- XmlBeanDefinitionReader:真正的實現類,主要方法
doLoadBeanDefinitions
try {
Document doc = doLoadDocument(inputSource, resource);
return registerBeanDefinitions(doc, resource);
}
方法doLoadDocument
主要是解析xml文件成document文檔,沒什麼好說的。
方法registerBeanDefinitions
就是讀取document文件,然後封裝成BeanDefinition,然後緩存到map中。
如果我有時間會詳細分析上面2個方法