上回总结了一下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);
}
}
}