上回總結了一下BeanFactory的結構,如果想對其進行深入的理解需要查看其創建和初始化步驟,下面總結一下BeanFactory的創建步驟
ApplicationContext是BeanFactory的外殼,在ApplicationContext初始化的時候要傳入配置文件的地址;
進過一些方法的調用在createBeanFactory方法中創建了BeanFactory
ApplicationContext中refresh()方法如下
publicvoid refresh() throws BeansException, IllegalStateException {
…
//初始化beanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
…
}
protected DefaultListableBeanFactory createBeanFactory() {
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
真正處理初始化的類是XmlBeanDefinitionReader
AbstractXmlApplicationContext的loadBeanDefinitions方法初始化了XmlBeanDefinitionReader
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
//實例化beandefintionreader並將beanfactory加入
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
//加入environment
beanDefinitionReader.setEnvironment(this.getEnvironment());
//加入loader
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this)); initBeanDefinitionReader(beanDefinitionReader);
//load
loadBeanDefinitions(beanDefinitionReader);
}
接下來XmlBeanDefinitionReader執行registerBeanDefinitions方法
public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
//實例化documentreader去處理doc對象
BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
documentReader.setEnvironment(this.getEnvironment());
int countBefore = getRegistry().getBeanDefinitionCount();
//執行registerBeanDefinitions處理doc documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
return getRegistry().getBeanDefinitionCount() - countBefore;
}
protected BeanDefinitionDocumentReader createBeanDefinitionDocumentReader() {
return BeanDefinitionDocumentReader.class.cast(BeanUtils.instantiateClass(this.documentReaderClass));
}
//創建Reader的上下文,類中存放了loader,beandefintionreader等,而beandefintionreader中存放了beanfactoy
protected XmlReaderContext createReaderContext(Resource resource) {
…
return new XmlReaderContext(resource, this.problemReporter, this.eventListener,this.sourceExtractor, this, this.namespaceHandlerResolver);
}
beanDefinitionDocumentReader執行doRegisterBeanDefinitions方法
protected void doRegisterBeanDefinitions(Element root) {
…
this.delegate = createHelper(this.readerContext, root, parent);
…
parseBeanDefinitions(root, this.delegate);
…
}
protected BeanDefinitionParserDelegate createHelper(
XmlReaderContext readerContext, Element root, BeanDefinitionParserDelegate parentDelegate) {
//創建delegate用來處理配置文件的內容
BeanDefinitionParserDelegate delegate = new BeanDefinitionParserDelegate(readerContext, environment);
delegate.initDefaults(root, parentDelegate);
return delegate;
}
protectedvoid parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
…
//處理方法
parseDefaultElement(ele, delegate);
…
}
privatevoid parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
//import
if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) { importBeanDefinitionResource(ele); }
//alias elseif (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) { processAliasRegistration(ele); }
//bean elseif (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) { processBeanDefinition(ele, delegate); }
//beans elseif (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) { doRegisterBeanDefinitions(ele); }
}
我們只看bean的處理
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
…
//處理配置的工具類
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
…
}
詳細的處理
public static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)throws BeanDefinitionStoreException {
String beanName = definitionHolder.getBeanName();
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
String[] aliases = definitionHolder.getAliases();
if (aliases != null) {
for (String aliase : aliases) {
registry.registerAlias(beanName, aliase);
}
}
}