Spring Ioc 第二部分

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012262450/article/details/79935775
@Override
	protected final void refreshBeanFactory() throws BeansException {
		//判断beanFactory是否存在,如果存在的话,清除所有的bean缓存、当前beanFactory设置为NULL
		if (hasBeanFactory()) {
			destroyBeans();
			closeBeanFactory();
		}
		try {
			//创建一个新的BeanFactory  
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			beanFactory.setSerializationId(getId());
			customizeBeanFactory(beanFactory);
			loadBeanDefinitions(beanFactory);
			synchronized (this.beanFactoryMonitor) {
				this.beanFactory = beanFactory;
			}
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}
	
	protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
		//创建一个通用的xml解析类,该类的主要作用就是,设置xsd、dtd实体
		//以及获取Document文档
		XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

		
		beanDefinitionReader.setEnvironment(getEnvironment());
		beanDefinitionReader.setResourceLoader(this);
		beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

		initBeanDefinitionReader(beanDefinitionReader);
		//加载configLocations xml文件
		loadBeanDefinitions(beanDefinitionReader);
	}

public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
		BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
		int countBefore = getRegistry().getBeanDefinitionCount();
		documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
		return getRegistry().getBeanDefinitionCount() - countBefore;
	}

}
createBeanDefinitionDocumentReader()方法返回DefaultBeanDefinitionDocumentReader对象,

用来解析遍历xml中beans下面的子集,判断当前bean是否默认标签,默认以<bean 开头,也就是默认标签的namespace是http://www.springframework.org/schema/beans


protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
		if (delegate.isDefaultNamespace(root)) {
			NodeList nl = root.getChildNodes();
			for (int i = 0; i < nl.getLength(); i++) {
				Node node = nl.item(i);
				if (node instanceof Element) {
					Element ele = (Element) node;
					//判断当前标签是否是默认标签,如果不是走else
					if (delegate.isDefaultNamespace(ele)) {
						parseDefaultElement(ele, delegate);
					}
					else {
						delegate.parseCustomElement(ele);
					}
				}
			}
		}
		else {
			delegate.parseCustomElement(root);
		}
	}

猜你喜欢

转载自blog.csdn.net/u012262450/article/details/79935775