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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章