SpringAOP[4.源碼解析總結(2)]

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






發佈了38 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章