跟着《spring源碼深度解析》學習spring
做過java開發,我們對以下的代碼一定很熟悉,這是最基本的spring使用方式
public static void main(String[] args) throws InterruptedException {
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("spring-test.xml"));
}
我們先來看看XmlBeanFactory類:
public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
}
XmlBeanFactory繼承了DefaultListableBeanFactory類,DefaultListableBeanFactory類是spring注冊和加載bean的預設實作;
我們檢視上面的源碼可以發現其實XmlBeanFactory和DefaultListableBeanFactory的差別隻是在于,XmlBeanFactory中使用了Xml讀取器XmlBeanDefinitionReader,進而實作了個性化的BeanDefinitionReader讀取。
XmlBeanDefinitionReader的主要處理步驟:
1、通過繼承AbstractBeanDefinitionReader中的方法,使用ResourceLoader将資源檔案路徑轉換成對應的Resource檔案;
2、通過DocumentLoader對Resource檔案進行轉換,将Resource檔案轉換成Document檔案;
3、通過實作接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader類對Document進行解析,并使用BeanDefinitionParserDelegate對Element進行解析
再看一下XmlBeanDefinitionReader相關的幾個類:
1、ResourceLoader:定義資源加載器,主要用于根據給定的資源檔案位址傳回對應的Resource;
2、BeanDefinitionReader:主要用于定義資源檔案讀取并轉換成BeanDefinition的功能;
3、DocumentLoader:定義從資源檔案轉換為Document檔案的功能;
4、AbstractBeanDefinitionReader:對EnvironmentCapable、BeanDefinitionReader類定義的功能進行實作;
5、BeanDefinitionDocumentReader:定義讀取Document并注冊BeanDefinition的功能;
6、BeanDefinitionParserDelegate:定義解析Element的各種方法。